2017-12-07 10 views
1

kann mir jemand sagen Was ist der Unterschied zwischen Zwischen-und Terminal-Operationen für Stream?Was ist der Unterschied zwischen Zwischen- und Terminaloperationen?

Stream Operationen werden in Pipelines kombiniert, um Ströme zu verarbeiten. Alle Operationen sind entweder intermediate oder terminal .. means.

+0

Streams sind faul, Code tatsächlich etwas tun, wenn eine Terminaloperation aufgerufen wird wie Summe, Toarray etc und Filter, Karte sind Zwischen, wahrscheinlich ein Betrüger –

Antwort

3

Ein Stream unterstützt mehrere Operationen und diese Operationen sind in intermediate und terminal Operationen unterteilt.

Der Unterschied zwischen diesen Operationen ist, dass eine Zwischenoperation faul ist, während eine Terminaloperation dies nicht ist. Wenn Sie eine Zwischenoperation für einen Stream aufrufen, wird die Operation nicht sofort ausgeführt. Es wird nur ausgeführt, wenn eine Terminaloperation in diesem Stream aufgerufen wird. In gewisser Weise wird eine Zwischenoperation gespeichert und wird aufgerufen, sobald eine Terminaloperation aufgerufen wird. Sie können mehrere Zwischenoperationen verketten, und keiner von ihnen wird irgendetwas tun, bis Sie eine Terminaloperation aufrufen. Zu diesem Zeitpunkt werden alle Zwischenoperationen, die Sie zuvor aufgerufen haben, zusammen mit der Terminaloperation aufgerufen.

Alle Zwischenoperationen geben Stream zurück (können verkettet werden), während Terminaloperationen dies nicht tun. Zwischenoperationen sind:

filter(Predicate<T>) 
map(Function<T>) 
flatmap(Function<T>) 
sorted(Comparator<T>) 
peek(Consumer<T>) 
distinct() 
limit(long n) 
skip(long n) 

Terminal-Operationen erzeugt einen nicht-Strom (nicht verkettet werden) Ergebnis wie Grundwert, eine Sammlung oder gar keinen Wert überhaupt.

Terminal Operations sind:

forEach 
toArray 
reduce 
collect 
min 
max 
count 
anyMatch 
allMatch 
noneMatch 
findFirst  
findAny 

Last 5 sind Kurzschlussoperationen.

+0

'limit()' und 'skip()' akzeptieren 'long' nicht' int' – Lino

+0

Sie haben Recht. Habe gerade meine Antwort aktualisiert. Danke @Lino! –

+0

danke .. @AlexMamo Ihre Erklärung ist ziemlich klar .. –

1

Terminal bedeutet, dass der Prozess beendet wird, z. B. das Sammeln eines Datenstroms zu einer Liste oder das Aggregieren eines Datenstroms.

Intermediate als in einen neuen Zustand, auf dem Weg zu einem Terminalbetrieb beim Übergang

2

Sie wahrscheinlich bemerkt, dass, wenn Sie einen Stream zu definieren, werden die Verfahren nicht nur eine auf dem ganzen Strom von einem genannt, aber Sie tun vielmehr etwas für jedes Element aus dem Stream. Um diese Ströme parallel laufen zu lassen, gibt es für jedes Element grundsätzlich eine ganze Pipeline.

Um mehrere Pipelines zu erstellen, verwendet Java 8+ die builder pattern. Mit jedem Zwischenschritt fügen Sie dem Stapel einen Filter oder Konverter hinzu. Um Java anzuweisen, Pipelines aus diesem Filterstapel zu generieren, verwenden Sie einen abschließenden Schritt. Dieser letzte Schritt kombiniert alle verschiedenen Pipelines. Normalerweise gibt es nur die Werte in einem definierten Format zurück, z. eine Liste, aber es kann auch einmal für jedes Element eine Funktion ausführen oder die Ergebnisse auf einen booleschen Wert oder eine Zahl reduzieren.

Verwandte Themen