2016-06-19 18 views
10

Qualcuno può spiegare chiaramente quali sono le differenze tra questi 4 metodi? Quando è più appropriato usare ciascuno di essi? Inoltre, in generale, qual è il nome di questo gruppo di metodi? Ci sono più metodi che fanno lo stesso lavoro? Potrebbe anche essere utile un collegamento con lo scaladoc.Via/ViaMat/to/toMat in Akka Stream

-D-

risposta

23

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) 
+0

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

+0

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