java java-8 java-stream reduce

Java Stream Reducción de matriz de objetos.



java-8 java-stream (3)

Con JDK-12, puedes usar

Object[] array = list.stream() .collect(Collectors.teeing( Collectors.reducing(1, a -> (Integer)a[0], (a,b) -> a * b), Collectors.mapping(a -> (String)a[1], Collectors.joining()), (i,s) -> new Object[] { i, s} ));

pero realmente deberías repensar tus estructuras de datos.

Esta respuesta muestra una versión del colector de teeing que funciona bajo Java 8.

Tengo una lista de matriz de 2 objetos:

List<Object[2]>

Donde objeto [0] es un entero y objeto [1] es una cadena.

¿Cómo puedo transmitir la lista y aplicar diferentes funciones en cada objeto? De modo que, el resultado será una matriz que tiene:

result[0] = multiplication of all object[0] result[1] = concatenation of all object[1]


Puedes lograr esto con reduce() :

public void testStacko() { List<Object[]> list = new ArrayList<>(); list.add(new Object[] {1, "foo"}); list.add(new Object[] {6, "|bar"}); list.add(new Object[] {15, "|baz"}); Object[] array = list.stream() .reduce( (obj1, obj2) -> new Object[] {(int) obj1[0] * (int) obj2[0], (String) obj1[1] + (String) obj2[1] } ) .get(); System.out.println(array[0]); // 90 System.out.println(array[1]); // foo|bar|baz }


Ya tienes una buena respuesta técnica, así que vamos a agregar una no-respuesta distinta.

Esto aquí: List<Object[2]> siente muy mal.

¿Por qué no usa algo como: List<Pair<Integer, String>> ?

En otras palabras: no renunciar a la información de tipo a la ligera. No haga un mal uso del Object[] como un contenedor sin tipo para rellenar cosas ya escritas. Java es un lenguaje compilado estáticamente . Significado: no resistir las fuerzas de los genéricos y la escritura estricta, en lugar de eso fluye con ellos.

Y el código de respuesta se convierte en:

.reduce(p1, p2 -> new Pair<>(p1.first * p2.first, p1.second + p2.second))

En serio: comienza utilizando Object[] ... y finaliza cuando cambias a ruby ​​porque la escritura es dinámica.