Sink.lazySink
Defers creation and materialization of a Sink
until there is a first element.
Signature¶
Description¶
Defers Sink
creation and materialization until when the first element arrives from upstream to the lazySink
. After that the stream behaves as if the nested sink replaced the lazySink
. The nested Sink
will not be created if upstream completes or fails without any elements arriving at the sink.
The materialized value of the Sink
is a Future
that is completed with the materialized value of the nested sink once that is constructed.
Can be combined with prefixAndTail to base the sink on the first element.
See also:
Examples¶
In this example we side effect from Flow.map
, the sink factory and Sink.foreach
so that the order becomes visible, the nested sink is only created once the element has passed map
:
sourceval matVal =
Source
.maybe[String]
.map { element =>
println(s"mapped $element")
element
}
.toMat(Sink.lazySink { () =>
println("Sink created")
Sink.foreach(elem => println(s"foreach $elem"))
})(Keep.left)
.run()
// some time passes
// nothing has been printed
matVal.success(Some("one"))
// now prints:
// mapped one
// Sink created
// foreach one
sourceCompletionStage<Optional<String>> matVal =
Source.<String>maybe()
.map(
element -> {
System.out.println("mapped " + element);
return element;
})
.toMat(
Sink.lazySink(
() -> {
System.out.println("Sink created");
return Sink.foreach(elem -> System.out.println("foreach " + elem));
}),
Keep.left())
.run(system);
// some time passes
// nothing has been printed
matVal.toCompletableFuture().complete(Optional.of("one"));
// now prints:
// mapped one
// Sink created
// foreach one
Reactive Streams semantics¶
cancels if the future fails or if the created sink cancels
backpressures when initialized and when created sink backpressures