SlideShare une entreprise Scribd logo
1  sur  106
Télécharger pour lire hors ligne
#DevoxxFR
L’API Collector
dans tous ses états
@JosePaumard
https://github.com/JosePaumard
https://www.slideshare.net/jpaumard
https://www.youtube.com/user/JPaumard
#DevoxxFR #ColJ8
@JosePaumard
Microsoft Virtual Academy
#DevoxxFR #ColJ8
@JosePaumard
#DevoxxFR #ColJ8
Questions ?
#ColJ8
#DevoxxFR #ColJ8
Collectors ?
Pourquoi s’intéresser aux collectors ?
▪ Partie intégrante de l’API Stream
▪ En général un peu laissée de côté
#DevoxxFR #ColJ8
Collectors ?
YouTube :
▪ Tutoriaux sur les Streams ~670k
▪ Tutoriaux sur les Collectors < 4,5k
#DevoxxFR #ColJ8
Collectors ?
Pourquoi s’intéresser aux collectors ?
▪ Partie intégrante de l’API Stream
▪ En général un peu laissée de côté
▪ Bien comprise elle peut simplifier les traitements
#DevoxxFR #ColJ8
movies.stream()
.flatMap(movie -> movie.actors().stream())
.collect(
Collectors.groupingBy(
Function.identity(),
Collectors.counting()
)
)
.entrySet().stream()
.max(Map.Entry.comparingByValue())
.get();
#DevoxxFR #ColJ8
movies.stream()
.collect(
Collectors.groupingBy(
movie -> movie.releaseYear(),
Collector.of(
() -> new HashMap<Actor, AtomicLong>(),
(map, movie) -> {
movie.actors().forEach(
actor -> map.computeIfAbsent(actor, a -> new AtomicLong()).incrementAndGet()
) ;
},
(map1, map2) -> {
map2.entrySet().stream().forEach(
entry -> map1.computeIfAbsent(entry.getKey(), a -> new AtomicLong()).addAndGet(entry.getValue().get())
) ;
return map1 ;
},
new Collector.Characteristics [] {
Collector.Characteristics.CONCURRENT.CONCURRENT
}
)
)
)
.entrySet().stream()
.collect(
Collectors.toMap(
entry5 -> entry5.getKey(),
entry5 -> entry5.getValue()
.entrySet().stream()
.max(Map.Entry.comparingByValue(Comparator.comparing(l -> l.get())))
.get()
)
.entrySet()
.stream()
.max(Comparator.comparing(entry -> entry.getValue().getValue().get()))
.get();
#DevoxxFR #ColJ8
Collectors ?
Pourquoi s’intéresser aux collectors ?
▪ Partie intégrante de l’API Stream
▪ En général un peu laissée de côté
▪ Bien comprise elle peut simplifier les traitements
▪ Avec quelques précautions…
#DevoxxFR #ColJ8
Quelques mots sur les
Stream
#DevoxxFR #ColJ8
Dualité dans les Streams
Dans les streams :
▪ Objet qui se connecte à une source
▪ Opérations intermédiaires / terminales
▪ Certaines opérations terminales peuvent être des
collectors
▪ Ces collectors peuvent prendre d’autres
collectors en paramètres…
#DevoxxFR #ColJ8
Dualité dans les Streams
Dans les streams :
▪ Toute opération sur un stream peut être
modélisée par un collector
▪ Quel intérêt ?
stream.collect(collector);
#DevoxxFR #ColJ8
Ou va-t-on ?
« Petit » rappel sur les streams
Les collectors qui existent
Comment étendre les collectors qui existent
Comment rendre le code lisible
Les collectors qui n’existent pas
#DevoxxFR #ColJ8
Opérations intermédiaires
#DevoxxFR #ColJ8
Un Stream c’est…
Un objet qui se connecte à une source de
données et les regarde passer
Un stream ne « contient pas » de données
stream
#DevoxxFR #ColJ8
stream
Change le type des données = mapping
#DevoxxFR #ColJ8
stream
Ne laisse pas tout passer = filtrage
#DevoxxFR #ColJ8
Mise à plat = flatMap
stream
#DevoxxFR #ColJ8
Mise à plat = flatMap
stream
#DevoxxFR #ColJ8
Map, Filter, FlatMap
Trois opérations qui ne stockent aucune
information pour fonctionner
Un objet entre = un objet sort, sans délai
Pas de le cas de toutes les opérations…
#DevoxxFR #ColJ8
Tri en fonction d’un comparateur…
Nécessite de « voir » toutes les données
stream
#DevoxxFR #ColJ8
stream
Distinct
Les données peuvent traverser une par
une, certaines sont éliminées
#DevoxxFR #ColJ8
Distinct, sorted
Sorted :
a besoin de « tout voir » pour faire le tri
Distinct :
doit « retenir ce qui passe » et laisse passer
Dans les deux cas : besoin d’un buffer
#DevoxxFR #ColJ8
Opérations intermédiaires
2 catégories :
- Opérations directes = stateless
- Opérations avec buffer = stateful
#DevoxxFR #ColJ8
Cas de limit et skip
Deux méthodes qui dépendent de l’ordre des
éléments :
- Limit = conserve les n premiers éléments
- Skip = saute les n premiers éléments
Ne gère pas un buffer mais un compteur
Besoin de voir les données « dans l’ordre »
#DevoxxFR #ColJ8
Opérations terminales
#DevoxxFR #ColJ8
Intermédiaire vs terminale
Seule une opération terminale déclenche la
consommation des éléments de la source
#DevoxxFR #ColJ8
Opérations terminales
Premier paquet :
- forEach
- count
- max, min
- reduce
- toArray
#DevoxxFR #ColJ8
Opérations terminales
Premier paquet :
- forEach
- count
- max, min
- reduce
- toArray
Consomment toutes les
données
#DevoxxFR #ColJ8
Opérations terminales
Deuxième paquet :
- allMatch
- anyMatch
- noneMatch
- findFirst
- findAny
#DevoxxFR #ColJ8
Opérations terminales
Deuxième paquet :
- allMatch
- anyMatch
- noneMatch
- findFirst
- findAny
N’ont pas besoin de
consommer toutes les
données
#DevoxxFR #ColJ8
Opérations terminales
Cas particuliers :
- max
- min
- reduce
Retourne un optional (cas des streams vides)
https://www.youtube.com/watch?v=Ej0sss6cq14
#DevoxxFR #ColJ8
Un premier collector
Et puis il y a collect !
Probablement le plus utilisé :
Prend un collector en paramètre
List<String> result =
strings.stream()
.filter(s -> s.itEmpty())
.collect(Collectors.toList());
#DevoxxFR #ColJ8
Un premier collector (bis)
Et puis il y a collect !
Probablement le plus utilisé :
Prend un collector en paramètre
Set<String> result =
strings.stream()
.filter(s -> s.itEmpty())
.collect(Collectors.toSet());
#DevoxxFR #ColJ8
Un deuxième collector
Et puis il y a collect !
Peut-être moins connu ?
Prend un collector en paramètre
String authors =
authors.stream()
.map(Author::getName)
.collect(Collectors.joining(", "));
Demo Time
#DevoxxFR #ColJ8
Un troisième collector
Construction de Map
Map<Integer, List<String>> result =
strings.stream()
.filter(s -> s.itEmpty())
.collect(
Collectors.groupingBy(
s -> s.length()
)
);
#DevoxxFR #ColJ8
3
4
5
one, two, three, four, five, six, seven, eight, nine, ten
one, two, six, ten
four, five, nine
three, seven, eight
groupingBy(String::length)



Map<Integer, List<String>>
#DevoxxFR #ColJ8
3
4
5
one, two, three, four, five, six, seven, eight, nine, ten
one, two, six, ten
four, five, nine
three, seven, eight
groupingBy(String::length, downstream)



.stream().collect(downstream)
.stream().collect(downstream)
.stream().collect(downstream)
#DevoxxFR #ColJ8
3
4
5
one, two, three, four, five, six, seven, eight, nine, ten
one, two, six, ten
four, five, nine
three, seven, eight
groupingBy(String::length, Collectors.counting())



4L
3L
3L
Map<Integer, Long>
#DevoxxFR #ColJ8
Un troisième collector (bis)
Construction de Map
Map<Integer, Long> result =
strings.stream()
.filter(s -> s.itEmpty())
.collect(
Collectors.groupingBy(
s -> s.length(), Collectors.counting()
)
);
Demo Time
#DevoxxFR #ColJ8
Un collector qui compte
Nombre d’articles par auteur
#DevoxxFR #ColJ8
Gent & Walsh, Beyond NP: The QSAT Phase Transition
Gent & Hoos & Prosser & Walsh, Morphing: Combining…
A1 A2
Gent
Walsh
Gent
Hoos
Prosser
Walsh
flatMap(Article::getAuthors)
#DevoxxFR #ColJ8
Gent & Walsh, Beyond NP: The QSAT Phase Transition
Gent & Hoos & Prosser & Walsh, Morphing: Combining…
Gent, Walsh, Gent, Hoos, Prosser, Walsh
flatMap(Article::getAuthors)
Gent
Walsh
Hoos



2L
2L
1L
Prosser  1L
groupingBy(
)
groupingBy(
identity(),
counting()
)
groupingBy(
identity(),
)
Demo Time
#DevoxxFR #ColJ8
Supply, accumulate and
combine
#DevoxxFR #ColJ8
Construction de listes
Reprenons le code :
List<String> result =
strings.stream()
.filter(s -> s.itEmpty())
.collect(Collectors.toList());
#DevoxxFR #ColJ8
stream a b b
collector
1) construire la liste
2) ajouter un élément
a b c
ArrayList
#DevoxxFR #ColJ8
Construction de listes
1) Construction de la liste : supplier
2) Ajout d’un élément à la liste : accumulateur
Supplier<List> supplier = () -> new ArrayList();
BiConsumer<List<E>, E> accumulator = (list, e) -> list.add(e);
#DevoxxFR #ColJ8
Cas parallèle
Stream
Collector
collector
1) construire la liste
2) ajouter un élément
3) fusionner
CPU 2
Stream
Collector
CPU 1
#DevoxxFR #ColJ8
Construction de listes
1) Construction de la liste : supplier
2) Ajout d’un élément à la liste : accumulateur
3) Combinaison de deux listes
Supplier<List> supplier = ArrayList::new;
BiConsumer<List<E>, E> accumulator = List::add;
BiConsumer<List<E>, List<E>> combiner = List::addAll;
#DevoxxFR #ColJ8
Construction de listes
Ce qui donne :
List<String> result =
strings.stream()
.filter(s -> s.itEmpty())
.collect(ArrayList::new,
List::add,
List::adAll);
#DevoxxFR #ColJ8
Construction de listes
Ce qui donne :
List<String> result =
strings.stream()
.filter(s -> s.itEmpty())
.collect(ArrayList::new,
Collection::add,
Collection::adAll);
#DevoxxFR #ColJ8
Construction de sets
Ce qui donne :
Set<String> result =
strings.stream()
.filter(s -> s.itEmpty())
.collect(HashSet::new,
Collection::add,
Collection::adAll);
#DevoxxFR #ColJ8
Concaténation de String
Plutôt qu’une liste on veut construire le
résultat dans une chaîne de caractères séparée
par des virgules :
« one, two, six »
Ne fonctionne que sur les streams de String
#DevoxxFR #ColJ8
Concaténation de String
Méthode collect :
strings.stream()
.filter(s -> s.length() == 3)
.collect(() -> new String(),
(finalString, s) -> finalString.concat(s),
(s1, s2) -> s1.concat(s2));
#DevoxxFR #ColJ8
Concaténation de String
Méthode collect :
strings.stream()
.filter(s -> s.length() == 3)
.collect(() -> new String(),
(finalString, s) -> finalString.concat(s),
(s1, s2) -> s1.concat(s2));
#DevoxxFR #ColJ8
Concaténation de String
Méthode collect :
strings.stream()
.filter(s -> s.length() == 3)
.collect(() -> new StringBuilder(),
(sb, s) -> sb.append(s),
(sb1, sb2) -> sb1.append(sb2));
#DevoxxFR #ColJ8
Concaténation de String
Méthode collect :
strings.stream()
.filter(s -> s.length() == 3)
.collect(StringBuilder::new,
StringBuilder::append,
StringBuilder::append);
#DevoxxFR #ColJ8
Concaténation de String
Méthode collect :
StringBuilder stringBuilder =
strings.stream()
.filter(s -> s.length() == 3)
.collect(StringBuilder::new,
StringBuilder::append,
StringBuilder::append);
#DevoxxFR #ColJ8
Concaténation de String
Méthode collect :
String string =
strings.stream()
.filter(s -> s.length() == 3)
.collect(StringBuilder::new,
StringBuilder::append,
StringBuilder::append)
.toString();
#DevoxxFR #ColJ8
Un collector
3 opérations
- supplier, construit un container de calcul
- accumulator
- combiner
#DevoxxFR #ColJ8
Un collector
3 opérations + 1
- supplier, construit un container de calcul
- accumulator
- combiner
- finisher, qui peut être la fonction identité
Demo Time
#DevoxxFR
Collectors custom :
1) Mapping
2) Filtrage, flat map
3) Jointures
Coffee break!
#DevoxxFR #ColJ8
À propos des types
#DevoxxFR #ColJ8
Interface Collector
public interface Collector<T, A, R> {
public Supplier<A> supplier(); // A : container intermédiaire
public BiConsumer<A, T> accumulator();// T : éléments traités
public BinaryOperator<A> combiner(); // retourne un A
public Function<A, R> finisher(); // touche finale
}
#DevoxxFR #ColJ8
Interface Collector
public interface Collector<T, A, R> {
public Supplier<A> supplier(); // A : container intermédiaire
public BiConsumer<A, T> accumulator();// T : éléments traités
public BinaryOperator<A> combiner(); // retourne un A
public Function<A, R> finisher(); // touche finale
public Set<Characteristics> characteristics();
}
#DevoxxFR #ColJ8
Type d’un collector
Décodage
- T : type des éléments du stream
- A : type du container intermédiaire
- R : type du container final
On a souvent A = R
Le finisher est souvent la fonction identité
≠
#DevoxxFR #ColJ8
3
4
5
one, two, three, four, five, six, seven, eight, nine, ten
one, two, six, ten
four, five, nine
three, seven, eight



groupingBy(String::length)
#DevoxxFR #ColJ8
3
4
5
one, two, three, four, five, six, seven, eight, nine, ten
one, two, six, ten
four, five, nine
three, seven, eight
Collector<String, ?, Map<Integer, List<String>> > c =
groupingBy(String::length)



#DevoxxFR #ColJ8
3
4
5
one, two, three, four, five, six, seven, eight, nine, ten
one, two, six, ten
four, five, nine
three, seven, eight
Collector<String, ?, Map<Integer, List<String>> > c =
groupingBy(String::length)



#DevoxxFR #ColJ8
3
4
5
one, two, three, four, five, six, seven, eight, nine, ten
one, two, six, ten
four, five, nine
three, seven, eight
Collector<String, ?, Map<Integer, List<String>> > c =
groupingBy(String::length)



#DevoxxFR #ColJ8
one, two, three, four, five, six, seven, eight, nine, ten
Collector<String, ?, Map<Integer, List<String>> > c =
groupingBy(
String::length,
?
)
#DevoxxFR #ColJ8
one, two, three, four, five, six, seven, eight, nine, ten
Collector<String, ?, Map<Integer, List<String>> > c =
groupingBy(
String::length,
Collector<String, ?, >
)
#DevoxxFR #ColJ8
one, two, three, four, five, six, seven, eight, nine, ten
Collector<String, ?, Map<Integer, Value>> c =
groupingBy(
String::length,
Collector<String, ?, Value>
)
counting() : Collector<T, ?, Long>
#DevoxxFR #ColJ8
Opérations intermédiaires
#DevoxxFR #ColJ8
7634L {2004, 7634L}
Map<Long, List<Entry<Integer, Long>>>
#DevoxxFR #ColJ8
7634L {2004, 7634L}
Map<Long, List<Entry<Integer, Long>>>
Entry<Integer, Long> -> Integer = mapping
Function<> mapper = entry -> entry.getKey();
Collectors.mapping(mapper, toList());
Demo Time
#DevoxxFR #ColJ8
Mapping et toMap
Un collector pour faire du mapping
Prend un downstream obligatoire
toMap :
stream.collect(mapping(function, downstream));
stream.collect(
toMapping(
t -> key,
t -> value));
#DevoxxFR #ColJ8
Collector intermédiaires
Le collector mapping intègre une opération
intermédiaire
stream.collect(mapping(function, downstream));
#DevoxxFR #ColJ8
Collector intermédiaires
Le collector mapping intègre une opération
intermédiaire
Intérêt ?
Pouvoir créer des downstream collectors
Un collector = intégrer le traitement d’un
stream en totalité
#DevoxxFR #ColJ8
Collector intermédiaires
Si l’on peut faire du mapping, pourquoi ne pas
faire du filtrage ou du flatmap ?
… on aura ces deux collectors dans Java 9
#DevoxxFR #ColJ8
Interface Collector
public interface Collector<T, A, R> {
public Supplier<A> supplier(); // A : container intermédiaire
public BiConsumer<A, T> accumulator();// T : éléments traités
public BinaryOperator<A> combiner(); // retourne un A
public Function<A, R> finisher(); // touche finale
public Set<Characteristics> characteristics();
}
#DevoxxFR #ColJ8
Collector intermédiaires
Le collector mapping intègre une opération
intermédiaire
stream.collect(mapping(function, downstream));
stream.collect(filtering(predicate, downstream));
Stream<T> donc Predicate<T>
Et Collector<T, ?, R>
#DevoxxFR #ColJ8
Collector intermédiaires
Le collector mapping intègre une opération
intermédiaire
Stream<T> donc Function<T, Stream<TT>>
Et Collector<TT, ?, R>
stream.collect(mapping(function, downstream));
stream.collect(flatMapping(flatMapper, downstream));
Demo Time
#DevoxxFR #ColJ8
Caractéristiques
Trois caractéristiques pour les collectors:
- IDENTITY_FINISH : le finisher est la fonction
identité
- UNORDERED : le collector ne conserve pas
l’ordre des éléments
- CONCURRENT : il est thread safe
#DevoxxFR #ColJ8
Application
1) L’auteur qui a le plus publié
2) L’auteur qui a le plus publié en un an
Demo Time
#DevoxxFR #ColJ8
Application
L’intérêt est de modéliser un traitement dans
un collecteur :
Pouvoir utiliser le collector en tant que
downstream pour des traitements plus
avancés
#DevoxxFR #ColJ8
Autre application
1) Les deux auteurs qui ont le plus publié
ensemble
2) Les deux auteurs qui ont le plus publié
ensemble en un an
Utilisation de StreamsUtils
#DevoxxFR #ColJ8
Gent & Walsh, Beyond NP: The QSAT Phase Transition
Gent & Hoos & Prosser & Walsh, Morphing: Combining…
Gent, Hoos, Prosser, Walsh
Gent, Walsh
{Gent, Walsh}
{Gent, Hoos} {Gent, Prosser} {Gent, Walsh}
{Hoos, Prosser} {Hoos, Walsh}
{Prosser, Walsh}
flatMap()
Demo Time
#DevoxxFR #ColJ8
Problème ?
On peut avoir un problème si le stream des
paires d’auteurs est vide
Ce qui arrive si les seuls articles sont des
articles à un auteur
Sur toute la base, pas de risque
… mais quand on regroupe par année…
#DevoxxFR #ColJ8
Inverser une relation
#DevoxxFR #ColJ8
Inversion d’une relation
On a travaillé sur la relation entre les articles et
leurs auteurs
On veut inverser cette relation : connaître les
articles par auteur
#DevoxxFR #ColJ8
Gent & Walsh, Beyond NP: The QSAT Phase Transition
{Art1, Gent}, {Art1, Walsh}
{Art1, {Gent, Walsh}}
flatMap()
groupingBy()
#DevoxxFR #ColJ8
Conclusion
#DevoxxFR #ColJ8
API Collector
API très riche
Un peu complexe, nécessite quelques repères
Surtout, nécessite de comprendre le
traitement que l’on veut faire
#DevoxxFR #ColJ8
API Collector
Un collector = un objet qui modélise un
traitement de données dans sa totalité
Peut donc être utilisé comme traitement
partiel d’un traitement plus large
#DevoxxFR
Merci pour votre
attention
#DevoxxFR
Questions ?
@JosePaumard
https://github.com/JosePaumard
https://www.slideshare.net/jpaumard
https://www.youtube.com/user/JPaumard

Contenu connexe

Tendances

Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJosé Paumard
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Ippon
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework springAntoine Rey
 
Java 8 lambda expressions
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressionsLogan Chien
 
Fondamentaux java
Fondamentaux javaFondamentaux java
Fondamentaux javaInes Ouaz
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Ippon
 
Java Collections | Collections Framework in Java | Java Tutorial For Beginner...
Java Collections | Collections Framework in Java | Java Tutorial For Beginner...Java Collections | Collections Framework in Java | Java Tutorial For Beginner...
Java Collections | Collections Framework in Java | Java Tutorial For Beginner...Edureka!
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataLhouceine OUHAMZA
 

Tendances (20)

Spring Boot RestApi.pptx
Spring Boot RestApi.pptxSpring Boot RestApi.pptx
Spring Boot RestApi.pptx
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
 
Les collections en Java
Les collections en JavaLes collections en Java
Les collections en Java
 
Spring Core
Spring CoreSpring Core
Spring Core
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 
spring-boot-fr.pdf
spring-boot-fr.pdfspring-boot-fr.pdf
spring-boot-fr.pdf
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 
Hibernate jpa
Hibernate jpaHibernate jpa
Hibernate jpa
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Java 8 lambda expressions
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressions
 
spring-api-rest.pdf
spring-api-rest.pdfspring-api-rest.pdf
spring-api-rest.pdf
 
Fondamentaux java
Fondamentaux javaFondamentaux java
Fondamentaux java
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon
 
Java Collections | Collections Framework in Java | Java Tutorial For Beginner...
Java Collections | Collections Framework in Java | Java Tutorial For Beginner...Java Collections | Collections Framework in Java | Java Tutorial For Beginner...
Java Collections | Collections Framework in Java | Java Tutorial For Beginner...
 
Java8 features
Java8 featuresJava8 features
Java8 features
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-data
 

Similaire à L'API Collector dans tous ses états

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
ArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateauArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateauJosé Paumard
 
Les Streams sont parmi nous
Les Streams sont parmi nousLes Streams sont parmi nous
Les Streams sont parmi nousJosé Paumard
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitementMadeline Pinthon
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...ECAM Brussels Engineering School
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystMathieu Goeminne
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8lyonjug
 
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséECAM Brussels Engineering School
 
Cassandra techniques de modelisation avancee
Cassandra techniques de modelisation avanceeCassandra techniques de modelisation avancee
Cassandra techniques de modelisation avanceeDuyhai Doan
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Yannick Chartois
 

Similaire à L'API Collector dans tous ses états (20)

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
ArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateauArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateau
 
Les Streams sont parmi nous
Les Streams sont parmi nousLes Streams sont parmi nous
Les Streams sont parmi nous
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitement
 
Marzouk collection-map
Marzouk collection-mapMarzouk collection-map
Marzouk collection-map
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
 
Cours php
Cours phpCours php
Cours php
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et Catalyst
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
 
GIT Fundamentals
GIT FundamentalsGIT Fundamentals
GIT Fundamentals
 
Formation python
Formation pythonFormation python
Formation python
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Devoxx France - Nouvelles du Front
Devoxx France - Nouvelles du FrontDevoxx France - Nouvelles du Front
Devoxx France - Nouvelles du Front
 
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
 
Cassandra techniques de modelisation avancee
Cassandra techniques de modelisation avanceeCassandra techniques de modelisation avancee
Cassandra techniques de modelisation avancee
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8
 

Plus de José Paumard

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19José Paumard
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfJosé Paumard
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingJosé Paumard
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKJosé Paumard
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsJosé Paumard
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of FlatteryJosé Paumard
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of FlatteryJosé Paumard
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternJosé Paumard
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapesJosé Paumard
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!José Paumard
 
Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2José Paumard
 
Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1José Paumard
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowJosé Paumard
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJosé Paumard
 
Linked to ArrayList: the full story
Linked to ArrayList: the full storyLinked to ArrayList: the full story
Linked to ArrayList: the full storyJosé Paumard
 

Plus de José Paumard (20)

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdf
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern Matching
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UK
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patterns
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor Pattern
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapes
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!
 
Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2
 
Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn Flow
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
Streams in the wild
Streams in the wildStreams in the wild
Streams in the wild
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridge
 
Free your lambdas
Free your lambdasFree your lambdas
Free your lambdas
 
Linked to ArrayList: the full story
Linked to ArrayList: the full storyLinked to ArrayList: the full story
Linked to ArrayList: the full story
 
Free your lambdas
Free your lambdasFree your lambdas
Free your lambdas
 

L'API Collector dans tous ses états