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

1. Vue d'ensemble

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

Dans cet article, nous examinerons rapidement les moyens d'obtenir le dernier élément d'un Stream. Gardez à l'esprit qu'en raison de la nature des cours d'eau, ce n'est pas une opération naturelle . Assurez-vous toujours que vous ne travaillez pas avec des flux infinis .

2. Utilisation de l' API Reduce

Réduire , en termes simples, réduit l'ensemble des éléments d'un Stream à un seul élément.

Dans ce cas, nous allons réduire l'ensemble des éléments pour obtenir le dernier élément fn le Stream. Gardez à l'esprit que cette méthode ne retournera que des résultats déterministes pour les flux séquentiels .

Utilisons une liste de valeurs de chaîne , récupérons le flux de la liste , 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 qu'avec le dernier élément. Si le flux est vide, il renverra une valeur nulle .

2. Utilisation de la fonction Skip

L'autre façon d'obtenir le dernier élément du flux est de sauter tous les éléments qui le précèdent . Cela peut être réalisé en utilisant la fonction Skip de la classe Stream . Gardez à l'esprit que dans ce cas, nous consommons le Stream deux fois, il y a donc un impact clair sur les performances .

Créons une liste de valeurs de chaîne et utilisons sa fonction de taille pour déterminer le nombre d'éléments à ignorer pour atteindre le dernier élément.

Voici l'exemple de code obtenant le dernier élément en utilisant skip :

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 conduirait à une séquence infinie d'évaluation effectuée sur des éléments infinis. Le saut et la réduction 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ération de limite .

Voici l'exemple de code où 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 par interrompre l'exécution du programme .

5. Conclusion

Nous avons vu différentes façons d'obtenir le dernier élément d'un Stream à la fois en utilisant les API de réduction et de saut . Nous avons également examiné pourquoi cela n'est pas possible avec des flux infinis.

Nous avons vu qu'obtenir le dernier élément d'un Stream n'est pas facile par rapport à le récupérer à partir d'autres structures de données. Ceci est dû à la nature paresseuse des Streams qui ne sont évalués que si la fonction de terminal est appelée et nous ne savons jamais si l'élément actuellement évalué est le dernier.

Des extraits de code sont disponibles à l'adresse over sur GitHub.