Tutti questi metodi sono necessari per unire due flussi in un unico flusso. Ad esempio, è possibile creare un Source
da un Source
e un Flow
, oppure è possibile creare un Sink
da un Flow
e un Sink
, oppure è possibile creare un Flow
su due Flow
s.
Per questo, ci sono due operazioni di base, to
e via
. Il primo permette di collegare un Source
o un Flow
ad un Sink
, mentre il secondo permette di collegare un Source
o un Flow
ad un Flow
:
source.to(sink) -> runnable graph
flow.to(sink) -> sink
source.via(flow) -> source
flow1.via(flow2) -> flow
Per riferimento, un grafico eseguibile è completamente collegato reattivo flusso che è pronto per essere materializzato ed eseguito.
*Mat
versioni di varie operazioni consentono di specificare come devono essere combinati i valori materializzati dei flussi inclusi nell'operazione. Come forse saprai, ogni stream ha un valore materializzato che può essere ottenuto quando il flusso viene materializzato. Ad esempio, Source.queue
produce un oggetto coda che può essere utilizzato da un'altra parte del programma per emettere elementi nel flusso corrente.
Per impostazione predefinita to
e via
sulle fonti e sui flussi mantiene solo il valore materializzato del flusso si chiama, ignorando il valore materializzata del suo argomento:
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
A volte, tuttavia, è necessario mantenere sia valori materializzati o combinarli in qualche modo. Ecco quando sono necessarie le varianti di metodi Mat
. Essi consentono di specificare la funzione combinando che assume valori materializzati di entrambi gli operandi e restituisce un valore materializzata della corrente combinata:
source.to(sink) equivalent to source.toMat(sink)(Keep.left)
flow1.via(flow2) equivalent to flow1.viaMat(flow2)(Keep.left)
Ad esempio, per mantenere entrambi i valori materializzato, è possibile utilizzare Keep.both
metodo o se solo bisogno l'mat.value dell'operando "giusto", è possibile utilizzare il metodo Keep.right
:
source.toMat(sink)(Keep.both) yields a tuple (mat.value of source, mat.value of sink)
Questo è un grande grande risposta, molto pulito! Nel frattempo giusto per chiarire un punto. Trovo strano che l'impostazione predefinita come in source.to (sink) mantenga il valore di origine (a sinistra). Se il sink è una piega, credo che sarei interessato al risultato della piega. In questo caso l'unico modo sarebbe usare toMat. In realtà non riesco a vedere l'impostazione predefinita per utilizzare il valore sinistro mentre il caso d'uso più frequente è quello di andare avanti con il giusto valore. Forse potresti lanciare qualche commento su questo. Potrei non pensarlo nel modo giusto. – MaatDeamon
@ MaratDeamon, non so i motivi esatti per questo, ma può essere collegato al fatto che tutte queste operazioni sono implementate genericamente in una supertrait di 'Source' e' Flow', quindi alcuni parametri di alcune operazioni che rendono senso per 'Flow's può avere senso per' Source's, e viceversa. –