Ответ 1
Все эти методы необходимы для объединения двух потоков в один поток. Например, вы можете создать Source
из Source
и Flow
, или вы можете создать Sink
из Flow
и Sink
, или вы можете создать Flow
из двух Flow
s.
Для этого существуют две основные операции: to
и via
. Первый позволяет подключить либо Source
, либо Flow
к Sink
, а последний позволяет подключить Source
или Flow
к a Flow
:
source.to(sink) -> runnable graph
flow.to(sink) -> sink
source.via(flow) -> source
flow1.via(flow2) -> flow
Для справки, runnable graph - полностью связанный реактивный поток, который готов к материализации и выполнению.
*Mat
версии различных операций позволяют указать, как объединить материализованные значения потоков, включенных в операцию. Как вы знаете, каждый поток имеет материализованное значение, которое может быть получено, когда поток материализуется. Например, Source.queue
дает объект очереди, который может использоваться другой частью вашей программы для извлечения элементов в бегущий поток.
По умолчанию to
и via
для источников и потоков только сохраняет материализованное значение потока, на которое он вызывается, игнорируя материализованное значение его аргумента:
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
Иногда, однако, вам нужно как-то сохранить как материализованные ценности, так и объединить их. Это, когда нужны Mat
варианты методов. Они позволяют указать функцию объединения, которая принимает материализованные значения обоих операндов и возвращает материализованное значение объединенного потока:
source.to(sink) equivalent to source.toMat(sink)(Keep.left)
flow1.via(flow2) equivalent to flow1.viaMat(flow2)(Keep.left)
Например, чтобы сохранить как материализованные значения, вы можете использовать метод Keep.both
, либо вам нужно только значение mat.value "правого" операнда, вы можете использовать метод Keep.right
:
source.toMat(sink)(Keep.both) yields a tuple (mat.value of source, mat.value of sink)