1. Vérification
Je pense que vous vous ennuyez peut-être déjà à apprendre à enchaîner des flux de données. Vous voulez enfin faire quelque chose avec les données.
La Stream
classe a trois méthodes standard qui ne construisent pas de flux, mais vérifient à la place le type de données qu'ils contiennent. Ces méthodes sont : anyMatch()
, allMatch()
, et noneMatch()
.
boolean anyMatch(rule)
méthode
Cette méthode vérifie si le flux contient au moins un élément qui satisfait la règle transmise à la méthode. S'il existe un tel élément, la méthode retourne true
, sinon false
.
Exemples
Code | Note |
---|---|
|
|
|
|
|
|
Dans le dernier exemple, nous ne retenons d'abord que les éléments inférieurs à zéro, puis nous vérifions le résultat pour voir si l'un des éléments filtrés est supérieur à zéro. Bien sûr, de tels éléments ne sont plus là.
méthode booléenne allMatch(rule)
Cette méthode vérifie si tous les éléments du flux correspondent à la règle (également appelée prédicat). La règle est passée en argument à la méthode :
Code | Note |
---|---|
|
(tous les éléments supérieurs à zéro) |
|
(y a-t-il des éléments inférieurs ou égaux à zéro ?) |
|
(nous avons retenu les éléments inférieurs à zéro) |
Dans le dernier exemple, nous n'autorisons d'abord que les éléments inférieurs à zéro à passer à travers le filtre, puis nous vérifions si tous les éléments retenus sont inférieurs à zéro. Le contrôle donne un résultat positif.
méthode booléenne noneMatch(rule)
La noneMatch()
méthode vérifie si le flux ne contient aucun élément correspondant à la règle transmise. C'est comme le contraire de la anyMatch()
méthode.
Code | Note |
---|---|
|
|
|
|
|
|
2. Classes utilitaires : Optional
classe
Parfois, il est très gênant pour les programmeurs de travailler avec null
des références. Par exemple, supposons que vous compariez deux chaînes. Si les deux variables ne sont pas null
, vous pouvez simplement appeler s1.equals(s2)
, et tout fonctionnera. Mais si s1
c'est possible null
, alors vous devez écrire du code qui gère cette situation afin d'éviter un NullPointerException
.
C'est pourquoi les programmeurs ont créé la Optional<T>
classe utilitaire. Son code ressemble à peu près à ceci :
Code | Note |
---|---|
|
Vérifie si la valeur n'est pas null Vérifie si la valeur est null Renvoie la valeur stockée. Lève une exception si la valeur est nulle. Renvoie la valeur non nulle stockée. Ou si la valeur stockée est null , alors renvoie la valeur transmise en tant qu'argument de méthode. Renvoie la valeur non nulle stockée ou lève une exception si la valeur est nulle. |
Le but de cette classe est simplement de stocker un objet T (une référence à un objet dont le type est T). La référence d'objet à l'intérieur d'un Optional<T>
objet peut être null
.
Cette classe permet aux programmeurs d'écrire un code légèrement plus joli. Comparons:
Utilisation facultative | Ne pas utiliser Facultatif |
---|---|
|
|
Un Optional
objet peut toujours être comparé à un autre Optional
objet à l'aide de la equals
méthode, même s'ils stockent null
des références.
En termes simples, la Optional
classe vous permet d'écrire de "belles" vérifications null
et de "belles" actions dans le cas où un Optional
objet stocke une null
valeur.
3. Trouver des éléments
Revenons à la Stream
classe. La Stream
classe a 4 méthodes supplémentaires qui vous permettent de rechercher des éléments dans un flux. Ces méthodes sont findFirst()
, findAny()
, min()
et max()
.
Optional<T> findFirst()
méthode
La findFirst()
méthode renvoie simplement le premier élément du flux. C'est tout ce qu'il fait.
La chose la plus intéressante à noter ici est que la méthode ne renvoie pas un T
objet, mais plutôt un Optional<T>
objet wrapper. Cela garantit que la méthode ne reviendra jamais null
après avoir échoué à trouver un objet.
Exemple:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello
Pour plus de clarté, divisons la dernière ligne en plusieurs lignes :
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello
La dernière get()
méthode consiste simplement à récupérer la valeur stockée à l'intérieur de l' Optional
objet.
Optional<T> findAny()
méthode
La findAny()
méthode renvoie n'importe quel élément du flux et s'arrête là. Cette méthode est similaire à findFirst()
, mais elle est idéale pour les flux utilisés dans des opérations parallèles.
Lors du traitement de flux en parallèle, il se peut qu'un élément ait déjà été trouvé dans une partie d'un flux, mais il n'est pas encore clair s'il s'agit du premier ou non.
Si de nombreux éléments correspondent à tous les filtres et qu'il est important pour le programmeur d'obtenir exactement le premier d'entre eux, la findFirst()
méthode est ce qu'il convient d'appeler. Si le programmeur sait qu'en réalité 0 ou 1 élément correspondra à tous les filtres, il suffit alors d'appeler simplement findAny()
- et ce sera plus rapide.
Optional<T> min(Comparator<T>)
méthode
La min()
méthode utilise un comparator
objet pour comparer tous les éléments du flux et renvoie l'élément minimum. Le moyen le plus pratique de définir un objet comparateur consiste à utiliser une fonction lambda.
Exemple de recherche de la chaîne la plus courte :
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();
Optional<T> max(Comparator<T>)
méthode
La max()
méthode utilise un comparator
objet pour comparer tous les éléments du flux et renvoie l'élément maximum. Le moyen le plus pratique de définir un objet comparateur consiste à utiliser une fonction lambda.
Exemple de recherche de la chaîne la plus longue :
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
GO TO FULL VERSION