2016-07-17 17 views
1

Nach this question, peek() ist faul, heißt es, wir sollten es irgendwie aktivieren. In der Tat, um es zu aktivieren, etwas zu der Konsole mich schon versucht, diese drucken:Wie Streams API Peek() -Funktion verwenden und es funktioniert?

Stream<String> ss = Stream.of("Hi","Hello","Halo","Hacker News"); 
ss.parallel().peek(System.out::println); 
System.out.println("lol"); // I wrote this line to print sth out to terminal to wake peek method up 

Aber das funktioniert nicht und der Ausgang ist:

lol 

So wie kann ich die peek funktionieren tatsächlich?

Wenn es keinen Weg zu dem gibt, was ist der Punkt der Verwendung von peek?

Antwort

3

Sie müssen in einem Stream für die Ausführung verwenden (Peek ist kein Terminal, es ist eine Zwischenoperation, die einen neuen Stream zurückgibt), z. count():

Stream<String> ss = Stream.of("Hi","Hello","Halo","Hacker News"); 
ss.parallel().peek(System.out::println).count(); 

Oder ersetzen peek mit forEach (das Terminal):

ss.parallel().forEach(System.out::println); 
+0

Mit '.count()' rufen Sie 'peek()' auf, bevor Sie die Elemente zählen? –

+1

@ehsan peek in Ihrem Fall ist eine schlechte Wahl, besser ist 'forEach' (und ja, Peek wird ausgeführt, bevor die Zählung zurückgegeben wird). –

+0

Sicher, aber '.count()' ist keine Verschwendung von Ressourcen? –

1

peek() -Methode Consumer als Parameter verwendet, was bedeutet, dass potenziell Sie den Status des eingehenden mutieren kann Element. Zur gleichen Zeit sagt Java-Dokumentation, dass peek sollte hauptsächlich für Debugging-Zwecke verwendet werden. Es ist ein Zwischen-Operator und erfordert einen Terminal-Operator wie forEach.

stream().peek(Consumer).forEach(Consumer); 
Verwandte Themen