2016-06-19 14 views
10

Kann jemand klar erklären, was der Unterschied zwischen diesen 4 Methoden ist? Wann ist es sinnvoller, jeden zu verwenden? Und wie heißt diese Methodengruppe? Gibt es mehr Methoden, die den gleichen Job machen? Ein Link zum scaladoc könnte ebenfalls helfen.Via/ViaMat/zu/toMat in Akka Stream

-D-

Antwort

23

All diese Methoden sind notwendig, um zwei Ströme zu einem Strom zu verbinden. Zum Beispiel können Sie ein Source aus einem Source erstellen und ein Flow, oder Sie können ein Sink aus einem Flow und einem Sink, oder Sie können ein Flow aus zwei Flow s schaffen erstellen.

Dafür gibt es zwei grundlegende Operationen, to und via. Die erstere ermöglicht es, die Verbindung entweder eine Source oder ein Flow zu einer Sink, während die letzteren ein Source oder ein Flow zu einem Flow anschließen können:

source.to(sink) -> runnable graph 
flow.to(sink)  -> sink 

source.via(flow) -> source 
flow1.via(flow2) -> flow 

für den Hinweis, ein lauffähiges Graph ein vollständig reaktiv verbunden ist Stream, der materialisiert und ausgeführt werden kann.

*Mat Versionen verschiedener Operationen ermöglichen es, anzugeben, wie materialisierte Werte der in der Operation enthaltenen Datenströme kombiniert werden sollen. Wie Sie vielleicht wissen, hat jeder Stream einen materialisierten Wert, der erhalten werden kann, wenn der Stream materialisiert wird. Zum Beispiel liefert Source.queue ein Warteschlangenobjekt, das von einem anderen Teil Ihres Programms verwendet werden kann, um Elemente in den laufenden Stream zu emittieren.

standardmäßig to und via auf Quellen und fließt nur die materialisierte Wert des Stroms hält es auf genannt wird, die materialisierte Wert seines Arguments zu ignorieren:

source.to(sink) yields mat.value of source 
source.via(flow) yields mat.value of source 

flow.to(sink)  yields mat.value of flow 
flow1.via(flow2) yields mat.value of flow1 

Manchmal jedoch müssen Sie beide halten materialisierte Werte oder irgendwie kombiniert. Das ist, wenn Varianten von Methoden benötigt werden. Sie ermöglichen es, die Kombination von Funktion zu spezifizieren, die materialisierten Werte der beiden Operanden nimmt und eine materialisierte Wert des kombinierten Stroms:

source.to(sink) equivalent to source.toMat(sink)(Keep.left) 
flow1.via(flow2) equivalent to flow1.viaMat(flow2)(Keep.left) 

Zum Beispiel zu halten beide Werte materialisiert, Sie Keep.both Methode verwenden können, oder wenn Sie nur die mat.value der „richtigen“ Operanden benötigen, können Sie Keep.right Methode verwenden:

source.toMat(sink)(Keep.both) yields a tuple (mat.value of source, mat.value of sink) 
+0

Dies ist eine große große Antwort, sehr ordentlich! In der Zwischenzeit nur um einen Punkt klarzustellen. Ich finde es seltsam, dass der Standardwert wie in source.to (sink) den Quellwert (links) behält. Wenn die Senke eine Falte ist, würde ich mich für das Ergebnis der Faltung interessieren. In diesem Fall wäre der einzige Weg ToMat zu verwenden. Tatsächlich kann ich einfach nicht sehen, dass der Standardwert der linke Wert ist, während der häufigste Anwendungsfall der richtige Wert ist. Vielleicht könntest du ein paar Kommentare dazu schreiben. Ich denke nicht, dass es richtig ist. – MaatDeamon

+0

@MaatDeamon, ich kenne keine genauen Gründe dafür, aber es kann mit der Tatsache verbunden sein, dass all diese Operationen generisch in einem Superpass von "Source" und "Flow" implementiert sind, daher einige Parameter einiger Operationen, die machen Sinn für 'Flow's kann weniger Sinn machen für' Source's, und umgekehrt. –

Verwandte Themen