Secuencias de Java 8: recopilación e inversión de secuencias en la lista

En este tutorial, aprenda a recopilar e invertir un flujo en una lista en Java 8 con Collectors.toList() y Collections.reverse(), así como con Collectors.collectingAndThen().

Introducción

Una secuencia representa una secuencia de elementos y admite diferentes tipos de operaciones que conducen al resultado deseado. La fuente de un flujo suele ser una Colección o un Array, desde el cual se transmiten los datos.

Los flujos se diferencian de las colecciones en varios aspectos; sobre todo porque los flujos no son una estructura de datos que almacena elementos. Son de naturaleza funcional, y vale la pena señalar que las operaciones en un flujo producen un resultado y, por lo general, devuelven otro flujo, pero no modifican su origen.

Para "solidificar" los cambios, reúne los elementos de un flujo en una Colección.

En esta guía, veremos cómo recopilar e invertir una lista en Java.

Recopilar e invertir una lista en Java

El primer enfoque sería recolectar() el flujo en una lista y luego usar el método Collections.reverse() en la lista, que lo invierte en el lugar.

{.icon aria-hidden=“true”}

Nota: Si también desea ordenar la colección mientras la invierte, puede usar el método sorted(Comparator.reverseOrder()) en la cadena. Sin embargo, esto impondrá un orden relativo de elementos completamente nuevo.

Definamos un flujo con algunos elementos, reúnalos en una lista, invierta la lista e imprímala:

1
2
3
4
5
Stream<?> s = Stream.of(1, 2, 3, 4, 5);

List<?> list = s.collect(Collectors.toList());
Collections.reverse(list);
System.out.println(list);

Esto resulta en:

1
[5, 4, 3, 2, 1]

Esto funciona bien, pero hay una forma más sencilla de hacerlo: todo en un solo método. El método collectingAndThen() nos permite introducir una Función de transformación de acabado adicional además del método collect(). De esta forma, podemos recopilar el flujo y realizar la llamada Collections.reverse() en la misma llamada collect().

Recolectar e invertir una lista con recolectar y luego () {#recolectar y revertir lista con recolectar y luego}

If you'd like to read more about collectingAndThen() - read our detailed, definitive Guía para recopiladores de Java 8: coleccionar y luego ()!

Echemos un vistazo a cómo podemos usar collectingAndThen() para agrupar las transformaciones en una sola llamada:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Stream<?> s = Stream.of(1, 2, 3, 4, 5);

List<?> list = s.collect(
        Collectors.collectingAndThen(
                Collectors.toList(),
                l -> {Collections.reverse(l); return l; }
        )
);

System.out.println(list);

Aquí, hemos suministrado un adaptador Collector al método collect(). El recopilador adaptado ejecuta Collectors.toList() y una función Lambda para invertir y devolver la lista invertida. Finalmente, ¡el valor devuelto se asigna a la variable de referencia lista!

Si desea obtener más información sobre interfaces funcionales y expresiones lambda en Java, lea nuestra [Guía de interfaces funcionales y expresiones lambda en Java](/guide-to-funcional-interfaces-and-lambda-expresions-in- Java/)!

Esto resulta en:

1
[5, 4, 3, 2, 1]

Conclusión

En esta breve guía, hemos echado un vistazo a cómo puede recopilar y revertir un flujo/lista en Java 8, usando collect() y Collections.reverse(), individualmente y juntos a través de la método recolectandoYLuego().