Ответ 1
-
via - это просто ярлык для viaMat (...) (Keep.left), и на самом деле так оно реализовано:
override def via[T, Mat2](flow: Graph[FlowShape[Out, T], Mat2]): Repr[T] = viaMat(flow)(Keep.left)
-
toMat - это то же самое, что и для viaMat, но для приемников, оно позволяет сохранить материализованное значение слева (источник/поток) или правую (сточную) сторону или оба
-
Keep.both - это просто псевдоним для
(a:A,b:B) => (a, b)
, то есть функция, которая принимает два входных параметра и возвращает их как кортеж. Он имел материализованное значение как левой, так и правой стороны при объединении двух потоков (или источника и потока, потока и стока и т.д.)
Я буду анализировать вашу строку кода:
// you're keeping the materialized value of flow
val source2 = Source (1 to 10).viaMat(flow)(Keep.right)
// you're keeping both materialized values, i.e. the one of flow from previous step
// and the one o sink.
val runnableGraph = source2.toMat(sink)(Keep.both)
runnableGraph.run() // returns a tuple (flowMatVal, sinkMatVal)
Когда вы присоединяетесь к двум частям потока (например, источнику, потоку/потоку, потоку и стоку), каждый из них имеет материализованное значение, которое вы получаете при запуске потока. Поведение по умолчанию при объединении с помощью /to поддерживает левую сторону. Если вы используете viaMat/toMat, вы можете сохранить правильное материализованное значение или оба из них как кортеж.