Java 12 introdujo una nueva funcionalidad en la API de Streams: el colector teeing, el cual permite combinar dos colectores en una sola operación y fusionar sus resultados en un solo valor. Esta característica proporciona una forma elegante y eficiente de realizar dos operaciones de recolección en paralelo sobre un mismo flujo de datos.
El colector teeing se encuentra en la clase Collectors y permite procesar un Stream<T> en dos colectores distintos. Luego, combina los resultados mediante una función de fusión.
El metodo sería el siguiente:
public static <T, R1, R2, R> Collector<T, ?, R> teeing(
Collector<? super T, ?, R1> downstream1,
Collector<? super T, ?, R2> downstream2,
BiFunction<? super R1, ? super R2, R> merger)
Los parametros son:
- downstream1: Primer colector que procesará el flujo de datos.
- downstream2: Segundo colector que operará sobre el mismo flujo.
- merger: Función que combina los resultados de ambos colectores en un solo valor.
Supongamos que queremos calcular simultáneamente el promedio y el mínimo de una lista de números.
import java.util.List;
import java.util.stream.Collectors;
public class TeeingExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(3, 5, 7, 2, 8, 10);
var result = numbers.stream().collect(
Collectors.teeing(
Collectors.averagingDouble(i -> i),
Collectors.minBy(Integer::compareTo),
(average, min) -> "Promedio: " + average + ", Mínimo: " + min.orElseThrow()
)
);
System.out.println(result);
}
}
Y la salida sería:
Promedio: 5.833333333333333, Mínimo: 2
El colector teeing en Java 12 proporciona una forma eficiente de combinar dos colectores en una sola operación de Stream, evitando iteraciones adicionales y haciendo el código más legible. Su versatilidad lo convierte en una herramienta valiosa para el procesamiento de datos en Java moderno.