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)
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
@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. –