Améliorations de l’API Java 9 Stream

Améliorations de l'API Java 9 Stream

1. Vue d'ensemble

Dans cette brève description, nous allons nous concentrer sur les nouvelles améliorations intéressantes apportées à l’API de flux à venir dans Java 9.

2. Diffusion en continu / en baisse

Des discussions sur ces méthodes sont apparues à plusieurs reprises surStackOverflow (la plus populaire estthis one).

Imaginons que nous voulions générer unStream deStrings en ajoutant un caractère à la valeur deStream précédente jusqu'à ce que la longueur de la valeur actuelle dans ceStream soit inférieure à 10.

Comment pourrions-nous le résoudre dans Java 8? Nous pourrions utiliser l'une des opérations intermédiaires de court-circuit commelimit,allMatch qui servent réellement à d'autres fins ou écrire nos proprestakeWhile implementation basés sur unSpliterator qui, à son tour , complique un problème aussi simple.

Avec Java 9, la solution est simple:

Stream stream = Stream.iterate("", s -> s + "s")
  .takeWhile(s -> s.length() < 10);

L'opérationtakeWhile prend unPredicate qui est appliqué aux éléments pour déterminer le préfixe le plus long de ces éléments (si un flux est ordonné) ou un sous-ensemble des éléments du flux (lorsqu'un flux n'est pas ordonné).

Pour aller de l'avant, nous avons mieux compris ce que signifient les termes «le plus long préfixe» et «un sous-ensembleStream’s»:

  • the longest prefix est une séquence contiguë d'éléments du flux qui correspondent au prédicat donné. Le premier élément de la séquence est le premier élément de ce flux et l'élément qui suit immédiatement le dernier élément de la séquence ne correspond pas au prédicat donné.

  • a Stream’s subset est un ensemble de certains éléments (mais pas tous) desStream qui correspondent au prédicat donné.

Après avoir introduit ces termes clés, nous pouvons facilement comprendre une autre nouvelle opérationdropWhile.

Il fait exactement le contraire detakeWhile. Si un flux est ordonné, ledropWile renvoie un flux constitué des éléments restants de ceStreamafter dropping the longest prefix d'éléments qui correspondent au prédicat donné.

Sinon, si unStream n'est pas ordonné, ledropWile renvoie un flux constitué des éléments restants de ceStreamafter dropping a subset d'éléments qui correspondent au prédicat donné.

Jetons les cinq premiers éléments en utilisant lesStream obtenus précédemment:

stream.dropWhile(s -> !s.contains("sssss"));

En termes simples, l'opérationdropWhile supprimera des éléments tandis que le prédicat donné pour un élément renvoietrue et arrête de supprimer sur lefalse du premier prédicat.

3. Stream Iterate

La nouvelle fonctionnalité suivante estthe overloaded iterate method for finite Streams generation. A ne pas confondre avec la variantefinite qui renvoie unStream séquentiel infini produit par une fonction.

Un nouveauiterate modifie légèrement cette méthode en ajoutant un prédicat qui s'applique aux éléments pour déterminer quand le Stream doit se terminer. Son utilisation est très pratique et concise:

Stream.iterate(0, i -> i < 10, i -> i + 1)
  .forEach(System.out::println);

Il peut être associé à l'instructionfor correspondante:

for (int i = 0; i < 10; ++i) {
    System.out.println(i);
}

4. Stream Ofnullable

Il y a des situations où nous devons mettre un élément dans unStream. Parfois, cet élément peut être unnull, mais nous ne voulons pas que notreStream contienne de telles valeurs. Il provoque l'écriture soit d'une instructionif, soit d'un opérateur ternaire qui vérifie si un élément est unnull.

En supposant que les variablescollection etmap, ont été créées et remplies avec succès, regardez l'exemple suivant:

collection.stream()
  .flatMap(s -> {
      Integer temp = map.get(s);
      return temp != null ? Stream.of(temp) : Stream.empty();
  })
  .collect(Collectors.toList());

Pour éviter un tel code standard, la méthodeofNullable a été ajoutée à la classeStream. Avec cette méthode, l'échantillon précédent peut être simplement transformé en:

collection.stream()
  .flatMap(s -> Stream.ofNullable(map.get(s)))
  .collect(Collectors.toList());

5. Conclusion

Nous avons examiné les principaux changements apportés à Stream API dans Java 9 et la manière dont ces améliorations nous aideront à écrire des programmes plus emphatiques avec moins d’efforts.

Comme toujours, les extraits de code peuvent être trouvésover on Github.