2017-06-08 6 views
-1

von Java API 8: peek (Consumer action)Wie Stream.peek in Java 8 funktioniert?

Gibt einen Strom von den Elementen dieser Strom besteht, zusätzlich auf jedes Element die vorgesehenen Maßnahmen durchführen, wie Elemente aus dem resultierenden Strom verbraucht werden.

Ich habe den Code mit Java 8 peek, die ich nicht verstehen kann:

Die erste Version:

IntStream in = IntStream.range(3, 8); 
in.peek(System.out::print).map(x->x*2); 

Ich gehe davon aus, dass dieser Code ergibt sich aus Abbildung drucken würde, dh 68101214. Aus irgendeinem Grund dieser Code druckt nichts.

Zweite Version:

IntStream in = IntStream.range(3, 8); 
in.peek(System.out::print).map(x->x*2).boxed().forEach(System.out::print); 

Dieser Code druckt 3648510612714, das heißt eine Nummer aus dem ursprünglichen Strom, die Anzahl nach der Kartierung und so weiter. Was ist die Logik?

+0

Mit Peek können Sie in die Stream-Elemente schauen, während sie durch die Pipe navigieren. Das ist alles. –

+3

Sie haben keine * Terminal Operation * im ersten Fall, also passiert nichts. –

+1

Java-Streams werden träge ausgeführt, und die Ausführung erfolgt, sobald eine Terminal-Operation in diesem Stream aufgerufen wird. – Dummy

Antwort

1

Der Grund dafür ist, dass der erste Stream nicht wirklich ausgeführt wird.

Im zweiten Stream rufen Sie forEach an, was tatsächlich zur Ausführung des Streams führt.

Sie könnten .count() am Ende des ersten Streams aufrufen und es würde laufen.

+0

Collectors.asList ist nicht in Java 8 API –

+0

Gemeint 'toList()' –

+0

I compiliere nicht in.peek (System.out :: print) .map (x-> x * 2) .collect (Collectors.toList()); –