web-dev-qa-db-fra.com

Comment séparer une liste par une condition en utilisant Java 8 flux

Considérez le code suivant:

 List<Integer> odd = new ArrayList<Integer>();
 List<Integer> even = null;  
 List<Integer> myList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
 even = myList.stream()
              .filter(item -> {
                   if(item%2 == 0) { return true;}
                   else { 
                           odd.add(item); 
                           return false;
                   }
              })
              .collect(Collectors.toList());

Ce que j'essaie de faire ici, c'est de récupérer les valeurs paires et impaires d'une liste dans des listes distinctes.

La méthode stream filter() renvoie true pour les éléments pairs et le collecteur de flux les collectera.
Pour les cas étranges, le filtre renverra false et l'élément n'atteindra jamais le collecteur.

J'ajoute donc des nombres impairs dans une autre liste que j'ai créée auparavant sous le bloc else.

Je sais que ce n'est pas une manière élégante de travailler avec des flux. Par exemple, si j'utilise un flux parallèle, il y aura un problème de sécurité des threads avec la liste impaire. Je ne peux pas l'exécuter plusieurs fois avec des filtres différents pour des raisons de performances (devrait être O (n)).

Ceci est juste un exemple pour un cas d'utilisation, la liste peut contenir n'importe quel objet et le lambda à l'intérieur du filtre doit les séparer en fonction d'une logique dans des listes distinctes.

En termes simples: à partir d'une liste, créez plusieurs listes contenant des éléments séparés en fonction de certains critères.

Sans flux, il suffirait d'exécuter une boucle for et de faire un if-else simple et de collecter les éléments en fonction des conditions.

17
Roy

Voici un exemple de la façon dont vous pouvez séparer les éléments (numéros) de cette liste en nombres pairs et impairs:

List<Integer> myList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

Map<Boolean, List<Integer>> evenAndOdds = myList.stream()
        .collect(partitioningBy(i -> i % 2 == 0));

Vous obtiendrez des listes de nombres pairs/impairs comme celui-ci (l'une ou l'autre liste peut être vide):

List<Integer> even = evenAndOdds.get(true);
List<Integer> odd = evenAndOdds.get(false);

Vous pouvez passer n'importe quel lambda avec la logique requise dans partitioningBy.

33