realizar entera divisiones decimales java filter java-8 java-stream data-partitioning

entera - division java decimales



¿Cuál es la mejor manera de dividir una colección en 2 colecciones diferentes? (6)

Puede usar Collectors.partitioningBy :

Map< Boolean, Set<Integer> > map = mySet.stream().collect( Collectors.partitioningBy( y -> y % 2 == 0, Collectors.toSet() ) ); Set<Integer> odds = map.get(Boolean.TRUE); Set<Integer> evens = map.get(Boolean.FALSE);

EDITAR:

Veo que hay un par de respuestas similares. La pequeña diferencia aquí es que muestra cómo obtener las colecciones como Set lugar de List en caso de que OP lo desee de esa manera.

Tengo un conjunto de números:

Set<Integer> mySet = [ 1,2,3,4,5,6,7,8,9]

Quiero dividirlo en 2 juegos de probabilidades y uniones.

Mi manera era usar el filtro dos veces:

Set<Integer> set1 = mySet.stream().filter(y -> y % 2 == 0).collect(Collectors.toSet()) Set<Integer> set2 =mySet.stream().filter(y -> y % 2 != 0).collect(Collectors.toSet())

No me gusta esta solución porque reviso todo el set dos veces.

¿Hay alguna forma más inteligente de hacerlo?


Puede usar la Collectors#partitioningBy ejemplo, a continuación.

Map<Boolean,List<Integer>> evenOddMap = mySet.stream().collect(Collectors.partitioningBy(e -> e % 2 == 0)); System.out.println("Even : "+evenOddMap.get(true)); System.out.println("Odd : "+evenOddMap.get(false));


Puedes usar un groupingBy

public void test(String[] args) { Integer[] test = {1,2,3,4,5,6,7,8,9}; Map<Integer, List<Integer>> evenOdd = Arrays.stream(test).collect(Collectors.groupingBy(i -> i & 1)); Set<Integer> evens = new HashSet<>(evenOdd.get(0)); Set<Integer> odds = new HashSet<>(evenOdd.get(1)); System.out.println("Evens "+evens+" Odds "+odds); }


Siempre que tenga colecciones para mantener los valores, lo siguiente puede ser una solución.

data.stream().forEach(x -> { if(x%2==0){ //add to collection holding even nums } else { //add to collection holding odd nums } })


Simple loop y if / else serían una solución limpia y simple

Set<Integer> setEven = new HashSet<>(); Set<Integer> setOdd = new HashSet<>(); for (Integer val : mySet) { if (val % 2 == 0) setEven.add(val); else setOdd.add(val); }

O usar un operador ternario funciona bien para simplificar aún más el código

for(Integer val : mySet) { ((val % 2 == 0) ? setEven : setOdd).add(val); }


Map<Boolean, List<Integer>> partitioned = set.stream().collect(Collectors.partitioningBy(x -> x%2 == 0));

Los elementos en partitioned.get(true) son pares; los elementos en partitioned.get(false) son impares.

A diferencia de hacerlo usando groupingBy , se garantiza que tanto false listas true como las false estarán presentes en el mapa, incluso si están vacías. (No documentado en Java 8, pero era cierto, el documento de Java 9 ahora lo declara explícitamente).