Java Language Flussi di consumo


Esempio

Un Stream sarà attraversato solo quando c'è un'operazione terminale , come count() , collect() o forEach() . In caso contrario, non verrà eseguita alcuna operazione sul Stream .

Nell'esempio seguente, nessuna operazione terminale viene aggiunta al Stream , quindi l'operazione filter() non verrà invocata e non verrà prodotto alcun output perché peek() NON è un'operazione terminale .

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

Vivi su Ideone

Questa è una sequenza Stream con un'operazione di terminale valida, quindi viene prodotta un'uscita.

Puoi anche usare forEach invece di peek :

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

Vivi su Ideone

Produzione:

2
4
6
8

Dopo aver eseguito l'operazione del terminale, il Stream viene consumato e non può essere riutilizzato.


Sebbene un determinato oggetto flusso non possa essere riutilizzato, è facile creare un Iterable riutilizzabile che deleghi ad una pipeline di flusso. Questo può essere utile per restituire una vista modificata di un set di dati live senza dover raccogliere i risultati in una struttura temporanea.

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);
}

Produzione:

foo
bar
foo
bar

Questo funziona perché Iterable dichiara un singolo metodo astratto Iterator<T> iterator() . Ciò lo rende efficacemente un'interfaccia funzionale, implementata da un lambda che crea un nuovo stream per ogni chiamata.


In generale, un Stream funziona come mostrato nell'immagine seguente:

Streaming

NOTA : i controlli degli argomenti vengono sempre eseguiti, anche senza un'operazione di terminale :

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()");
}

Vivi su Ideone

Produzione:

Abbiamo ottenuto una NullPointerException in quanto null è stato passato come argomento a filter ()