Java Language Corrientes de consumo


Ejemplo

Un Stream solo se atravesará cuando haya una operación de terminal , como count() , collect() o forEach() . De lo contrario, no se realizará ninguna operación en el Stream .

En el siguiente ejemplo, no se agrega ninguna operación de terminal a la Stream , por lo que la operación de filter() no se invocará y no se producirá ninguna salida porque peek() NO es una operación de terminal .

IntStream.range(1, 10).filter(a -> a % 2 == 0).peek(System.out::println);

Vivir en Ideone

Esta es una secuencia de Stream con una operación de terminal válida, por lo que se produce una salida.

También forEach usar forEach lugar de peek :

IntStream.range(1, 10).filter(a -> a % 2 == 0).forEach(System.out::println); 

Vivir en Ideone

Salida:

2
4
6
8

Una vez realizada la operación del terminal, el Stream se consume y no se puede reutilizar.


Aunque un objeto de flujo dado no puede ser reutilizado, es fácil crear un Iterable reutilizable que delega a un flujo de flujo. Esto puede ser útil para devolver una vista modificada de un conjunto de datos en vivo sin tener que recopilar resultados en una estructura temporal.

List<String> list = Arrays.asList("FOO", "BAR");
Iterable<String> iterable = () -> list.stream().map(String::toLowerCase).iterator();

for (String str : iterable) {
    System.out.println(str);
}
for (String str : iterable) {
    System.out.println(str);
}

Salida:

foo
bar
foo
bar

Esto funciona porque Iterable declara un solo método abstracto Iterator<T> iterator() . Eso hace que sea efectivamente una interfaz funcional, implementada por un lambda que crea una nueva transmisión en cada llamada.


En general, un Stream funciona como se muestra en la siguiente imagen:

Operación de la corriente

NOTA : Las comprobaciones de argumentos siempre se realizan, incluso sin una operación de terminal :

try {
    IntStream.range(1, 10).filter(null);
} catch (NullPointerException e) {
    System.out.println("We got a NullPointerException as null was passed as an argument to filter()");
}

Vivir en Ideone

Salida:

Obtuvimos una NullPointerException ya que null se pasó como un argumento para filtrar ()