Comment obtenir le dernier élément d’un flux en Java?

Comment obtenir le dernier élément d'un flux en Java?

1. Vue d'ensemble

L'API JavaStream était la principale fonctionnalité de la version Java 8. LesStreams représentent des séquences d'objets évaluées paresseusement et fournissent une API riche, fluide et monadique.

Dans cet article, nous allons jeter un coup d'œil rapide sur les moyens d'obtenir le dernier élément d'unStream. Gardez à l'esprit quedue to the nature of streams, it’s not a natural operation. Assurez-vous toujours que vous ne travaillez pas avec desStreams. infinis

2. Utilisation de l'APIReduce

Reduce, en termes simples, réduit l'ensemble des éléments d'unStream à un seul élément.

Dans ce cas, nous allons réduire l'ensemble des éléments pour obtenir le dernier élément fn lesStream. Gardez à l'esprit quethis method will only return deterministic results for sequential Streams.

Utilisons unList de valeursString, obtenons lesStream à partir desList, puis réduisons:

List valueList = new ArrayList<>();
valueList.add("Joe");
valueList.add("John");
valueList.add("Sean");

Stream stream = valueList.stream();
stream.reduce((first, second) -> second)
  .orElse(null);

Ici, le flux est réduit à un niveau où il ne reste que le dernier élément. Si le flux est vide, il renverra une valeurnull.

2. Utilisation de la fonction de saut

L'autre moyen d'obtenir le dernier élément du flux estby skipping all the elements before it. Ceci peut être réalisé en utilisant la fonctionSkip de la classeStream. Gardez à l'esprit que dans ce cas, nous consommons deux fois lesStream, donc il y a un impact clair sur les performances.

Créons unList de valeurs de chaîne et utilisons sa fonctionsize pour déterminer le nombre d’éléments à ignorer pour atteindre le dernier élément.

Voici l'exemple de code récupérant le dernier élément en utilisantskip:

List valueList = new ArrayList();
valueList.add("Joe");
valueList.add("John");
valueList.add("Sean");

long count = valueList.stream().count();
Stream stream = valueList.stream();

stream.skip(count - 1).findFirst().get();

“Sean” finit par être le dernier élément.

4. Obtenir le dernier élément d'un flux infini

Essayer d'obtenir le dernier élément du flux infini mènerait à une séquence d'évaluation infinie effectuée sur des éléments infinis. skip etreduce ne reviendront pas de l'exécution de l'évaluation à moins que nous ne limitions le flux infini à un nombre spécifique d'éléments en utilisant l'opérationlimit.

Voici l'exemple de code dans lequel nous avons pris un flux infini et essayé d'obtenir le dernier élément:

Stream stream = Stream.iterate(0, i -> i + 1);
stream.reduce((first, second) -> second).orElse(null);

Par conséquent, le flux ne reviendra pas de l'évaluation et finira parhalting the execution of the program.

5. Conclusion

Nous avons vu différentes façons d'obtenir le dernier élément d'unStream à la fois en utilisant les APIreduce etSkip. Nous avons également cherché à savoir pourquoi cela n’était pas possible avec des flux infinis.

Nous avons vu qu'obtenir le dernier élément d'unStream n'est pas facile en comparaison de le récupérer à partir d'autres structures de données. Ceci est dû à la nature paresseuse deStreams qui ne sont pas évalués à moins que la fonction terminale ne soit appelée etwe never know if the currently evaluated element is the last one.

Des extraits de code peuvent être trouvésover on GitHub.