Le moyen le plus efficace pour obtenir le dernier élément d'un flux

Stream ne pas avoir un last() méthode:

Stream<T> stream;
T last = stream.last(); //No such method

Quelle est la plus élégante et/ou un moyen efficace d'obtenir le dernier élément (ou null pour un vide de Flux)?

  • Si vous avez besoin de trouver le dernier élément d'un Stream, vous pouvez vouloir reconsidérer votre conception, et si vous voulez vraiment être à l'aide d'un Stream. Streams ne sont pas nécessairement ordonné ou finis. Si votre Stream est pas ordonné, à l'infini, ou les deux, le dernier élément n'a pas de sens. Dans mon esprit, le point d'une Stream est de fournir une couche d'abstraction entre les données et comment vous devez traiter. En tant que tel, un Stream lui-même n'a pas besoin de savoir quelque chose au sujet de l'ordre relatif des éléments. Trouver le dernier élément dans un Stream est O(n). Si vous aviez une autre structure de données, il pourrait être O(1).
  • le besoin était réel: la situation était à peu près à ajouter des articles à votre panier, chaque ajout d'erreur renvoyé info (certaines combinaisons d'éléments n'étaient pas valables), mais seulement la dernière addition d'erreur d'info (lorsque tous les points ont été ajoutés et une juste évaluation de la charrette qui pourrait être fait) était l'info nécessaire. (Oui, l'API que nous utilisons est brisé et ne peut pas être fixé).
  • Les flux infinis n'ont pas bien défini count() soit, mais Stream a encore un count() méthode. Vraiment, cet argument s'applique à tous les non-court-circuit terminal de l'opération sur les flux infinis.
  • Je pense que les diffusions ont last() méthode. Il pourrait y avoir une enquête, le 1er avril, la façon dont il doit être défini pour les flux infinis. Je propose: "Il ne revient jamais et il utilise au moins un processeur core à 100%. Sur les ruisseaux parallèles, il est nécessaire d'utiliser tous les coeurs à 100%."
InformationsquelleAutor Bohemian | 2014-12-18