-
Simplifie l’écriture des classes internes anonymes
-
Java 8+
-
Interface qui comporte une méthode unique
-
Hors
private,defaultetstatic
-
-
De préférence annotée
@FunctionalInterface
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}Comparator<String> c1 = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
};
Comparator<String> c2 = (String s1, String s2) -> {
return s1.compareToIgnoreCase(s2);
};Le type peut être omis
Comparator<String> c = (s1, s2) -> {
return s1.compareToIgnoreCase(s2);
};Si le bloc est une simple expression :
-
Suppression du bloc
-
Omission du mot-clé
return -
Omission du
;final
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);Quand une expression appelle une méthode existante :
-
Forme abrégée
<Type>+::+<méthode>
Comparator<String> c = String::compareToIgnoreCase;-
Soit une liste de
Person -
Calculer la moyenne de l’âge des personnes
List<Person> persons = ...
double sum = 0.0;
for (Person person: persons) {
sum += person.getAge();
}
double average = sum / persons.size();Beaucoup de boilerplate code
-
Focus sur le comment, pas sur le quoi
-
A l’inverse du tri,
sort()
-
Capitaliser les noms de famille
-
Conserver uniquement les adultes
-
Combinaison de cas d’utilisation
-
etc.
-
Stream de départ
-
Opérations intermédiaires → *
-
Opérations terminales → 1
-
Peut-être infini
-
map() -
filter() -
limit() -
skip() -
distinct() -
sorted()
-
Transforme un stream de types T en un autre stream de types R
-
Via une instance de
Function<T, R>
persons
.stream()
.map(new Function<Person,String>() {
@Override
public String apply(Person person) {
return person.getFirstName();
}
})
.map(new Function<String,String>() {
@Override
public String apply(String name) {
return name.toUpperCase();
}
});persons
.stream()
.map(person -> person.getFirstName())
.map(name -> name.toUpperCase());-
Transforme un stream de taille x en un autre stream de taille y < x
-
Via une instance de
Predicate
-
Transforme un stream de taille x en un autre stream de taille y < x
-
En conservant les n premiers éléments
-
Transforme un stream de taille x en un autre stream de taille y < x
-
En omettant les n premiers éléments
-
Transforme un stream de taille x en un autre stream de taille y < x
-
En omettant les doublons
-
Transforme un stream d’éléments en un stream d’éléments ordonnés
-
Via une instance de
Comparator<T>-
Ou selon l’ordre naturel des éléments
-
-
collect() -
forEach() -
reduce()
-
Regroupe les éléments d’un stream dans une collection concrète
-
Via une instance de
Collector<T, A, R>
stream.collect(Collectors.toList());
stream.collect(Collectors.toSet());
stream.collect(Collectors.toMap(
person -> person.getId(),
person -> person));
stream.collect(Collectors.toMap(
Person::getId,
Function.identity()));-
Aggrège les éléments d’un stream dans un élément unique
-
Via une instance de
BinaryOperator<T>
-
Depuis une collection existante
-
Depuis un tableau existant
-
Depuis des éléments
-
Depuis une fonction
List<Person> persons = ...
Stream<Person> stream = persons.stream();- all
-
Tous les éléments du stream vérifient le prédicat
- none
-
Aucun élément du stream ne vérifie le prédicat
- any
-
Au moins 1 élément du stream vérifie le prédicat
- any
-
Renvoie un élément quelconque du stream
- first
-
Renvoie le premier élément du stream (s’il est ordonné)
Order order = repository.load(1L);
if (order != null) {
// Do something with person
}
Optional<Order> optional = repository.load(1L);
optional.ifPresent(order -> {
// Do something with person
});