streams procesamiento parte examples ejercicios ejemplos datos con collection java java-stream

java - parte - ¿Recopilar tanto el emparejamiento como el no emparejamiento en un procesamiento de transmisión?



stream java ejemplos (2)

¿Hay una manera de recopilar elementos de flujo coincidentes y no coincidentes en un procesamiento? Tomemos este ejemplo:

final List<Integer> numbers = Arrays.asList( 1, 2, 3, 4, 5 ); final List<Integer> even = numbers.stream().filter( n -> n % 2 == 0 ).collect( Collectors.toList() ); final List<Integer> odd = numbers.stream().filter( n -> n % 2 != 0 ).collect( Collectors.toList() );

¿Hay alguna manera de evitar correr dos veces la lista de números? ¿Algo así como "coleccionista de fósforos y coleccionista de no coincidencias"?


Puedes hacerlo así,

Map<Boolean, List<Integer>> oddAndEvenMap = numbers.stream() .collect(Collectors.partitioningBy(n -> n % 2 == 0)); final List<Integer> even = oddAndEvenMap.get(true); final List<Integer> odd = oddAndEvenMap.get(false);


Si tiene más de 2 grupos (en lugar de impar e incluso aquí usando% 2), por ejemplo, para agrupar ints en las clases restantes% 3, puede usar una función:

Function<Integer, Integer> fun = i -> i%3; List<Integer> a = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Map<Integer, List<Integer>> collect = a.stream().collect(Collectors.groupingBy(fun)); System.out.println(collect); //{0=[3, 6, 9], 1=[1, 4, 7, 10], 2=[2, 5, 8]}

O imagina que tienes una lista de cadenas que deseas agrupar al iniciar char en lugar de agrupar coincidencias y no coincidentes (por ejemplo, comienza con una o no) que podrías hacer algo como:

Function<String, Character> fun = s -> s.charAt(0); List<String> a = Arrays.asList("baz","buzz","azz","ayy","foo","doo"); Map<Character, List<String>> collect = a.stream().collect(Collectors.groupingBy(fun)); System.out.println(collect); //{a=[azz, ayy], b=[baz, buzz], d=[doo], f=[foo]}