502 votes

Récupération d’une liste d’un java.util.stream.Stream en Java8

J'ai été jouer avec Java 8 lambdas de filtrer facilement les collections. Mais je n'ai pas trouvé de manière concise pour récupérer le résultat sous la forme d'une nouvelle liste dans la même déclaration. Voici mon plus concis approche jusqu'à présent:

List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList = new ArrayList<>();
sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add);

Des exemples sur le net n'a pas répondu à ma question, car ils s'arrêtent sans générer une nouvelle liste de résultats. Il doit y avoir une manière plus concise. Je me serais attendu, que le Flux de la classe a des méthodes comme toList(), à engager(), ...

Est-il possible que les variables targetLongList peut être directement affecté par la troisième ligne?

669voto

Maurice Naftalin Points 1718

Ce que vous faites peut-être la façon la plus simple, à condition que votre flux de séjours séquentiels—sinon, vous devrez mettre un appel séquentiel() avant d' forEach.

[plus tard edit: la raison de l'appel à séquentielle() est nécessaire, c'est que le code tel qu'il est (forEach(targetLongList::add)) serait racé si le flux était parallèle. Même alors, il ne permettra pas d'atteindre l'effet escompté, car forEach est explicitement non déterministe—même dans un flux séquentiel de la commande de l'élément de traitement n'est pas garantie. Vous devez utiliser forEachOrdered afin de garantir le bon de commande. L'intention de l'API Stream concepteurs est que vous allez utiliser collecteur dans cette situation, comme ci-dessous.]

Une alternative est

targetLongList = sourceLongList.stream()
    .filter(l -> l > 100)
    .collect(Collectors.toList());

195voto

MohamedSanaulla Points 1284

Une autre solution peut consister à utiliser `` :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X