Add examples for Fan-in operators #25468
This commit is contained in:
parent
b8a9f8b6d7
commit
91b0c387be
16 changed files with 316 additions and 1 deletions
|
|
@ -27,3 +27,10 @@ After completion of the original upstream the elements of the given source will
|
|||
|
||||
@@@
|
||||
|
||||
|
||||
## Example
|
||||
Scala
|
||||
: @@snip [FlowConcatSpec.scala](/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FlowConcatSpec.scala) { #concat }
|
||||
|
||||
Java
|
||||
: @@snip [SourceOrFlow.java](/akka-docs/src/test/java/jdocs/stream/operators/SourceOrFlow.java) { #concat }
|
||||
|
|
@ -28,3 +28,10 @@ source completes the rest of the other stream will be emitted.
|
|||
|
||||
@@@
|
||||
|
||||
|
||||
## Example
|
||||
Scala
|
||||
: @@snip [FlowInterleaveSpec.scala](/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FlowInterleaveSpec.scala) { #interleave }
|
||||
|
||||
Java
|
||||
: @@snip [SourceOrFlow.java](/akka-docs/src/test/java/jdocs/stream/operators/SourceOrFlow.java) { #interleave }
|
||||
|
|
@ -27,3 +27,10 @@ Merge multiple sources. Picks elements randomly if all sources has elements read
|
|||
|
||||
@@@
|
||||
|
||||
|
||||
## Example
|
||||
Scala
|
||||
: @@snip [FlowMergeSpec.scala](/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FlowMergeSpec.scala) { #merge }
|
||||
|
||||
Java
|
||||
: @@snip [SourceOrFlow.java](/akka-docs/src/test/java/jdocs/stream/operators/SourceOrFlow.java) { #merge }
|
||||
|
|
@ -28,3 +28,10 @@ smallest element.
|
|||
|
||||
@@@
|
||||
|
||||
|
||||
## Example
|
||||
Scala
|
||||
: @@snip [FlowMergeSpec.scala](/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FlowMergeSpec.scala) { #merge-sorted }
|
||||
|
||||
Java
|
||||
: @@snip [SourceOrFlow.java](/akka-docs/src/test/java/jdocs/stream/operators/SourceOrFlow.java) { #merge-sorted }
|
||||
|
|
@ -35,3 +35,10 @@ without emitting and the secondary stream already has completed or when the seco
|
|||
|
||||
@@@
|
||||
|
||||
|
||||
## Example
|
||||
Scala
|
||||
: @@snip [FlowOrElseSpec.scala](/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FlowOrElseSpec.scala) { #or-else }
|
||||
|
||||
Java
|
||||
: @@snip [SourceOrFlow.java](/akka-docs/src/test/java/jdocs/stream/operators/SourceOrFlow.java) { #or-else }
|
||||
|
|
@ -29,3 +29,10 @@ If materialized values needs to be collected `prependMat` is available.
|
|||
|
||||
@@@
|
||||
|
||||
|
||||
## Example
|
||||
Scala
|
||||
: @@snip [FlowOrElseSpec.scala](/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FlowPrependSpec.scala) { #prepend }
|
||||
|
||||
Java
|
||||
: @@snip [SourceOrFlow.java](/akka-docs/src/test/java/jdocs/stream/operators/SourceOrFlow.java) { #prepend }
|
||||
|
|
@ -27,3 +27,9 @@ Combines elements from each of multiple sources into @scala[tuples] @java[*Pair*
|
|||
|
||||
@@@
|
||||
|
||||
## Example
|
||||
Scala
|
||||
: @@snip [FlowZipSpec.scala](/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FlowZipSpec.scala) { #zip }
|
||||
|
||||
Java
|
||||
: @@snip [SourceOrFlow.java](/akka-docs/src/test/java/jdocs/stream/operators/SourceOrFlow.java) { #zip }
|
||||
|
|
@ -28,3 +28,10 @@ returned value downstream.
|
|||
|
||||
@@@
|
||||
|
||||
|
||||
## Example
|
||||
Scala
|
||||
: @@snip [FlowZipWithSpec.scala](/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FlowZipWithSpec.scala) { #zip-with }
|
||||
|
||||
Java
|
||||
: @@snip [SourceOrFlow.java](/akka-docs/src/test/java/jdocs/stream/operators/SourceOrFlow.java) { #zip-with }
|
||||
|
|
@ -7,12 +7,32 @@ package jdocs.stream.operators;
|
|||
import akka.stream.Materializer;
|
||||
import akka.stream.javadsl.Flow;
|
||||
|
||||
import akka.NotUsed;
|
||||
import akka.japi.function.Function2;
|
||||
|
||||
//#zip
|
||||
//#zip-with
|
||||
//#zip-with-index
|
||||
import akka.stream.javadsl.Sink;
|
||||
//#or-else
|
||||
//#prepend
|
||||
//#concat
|
||||
//#interleave
|
||||
//#merge
|
||||
//#merge-sorted
|
||||
import akka.stream.javadsl.Source;
|
||||
import akka.stream.javadsl.Sink;
|
||||
import java.util.Arrays;
|
||||
|
||||
//#merge-sorted
|
||||
//#merge
|
||||
//#interleave
|
||||
//#concat
|
||||
//#prepend
|
||||
//#or-else
|
||||
//#zip-with-index
|
||||
//#zip-with
|
||||
//#zip
|
||||
|
||||
//#log
|
||||
import akka.stream.Attributes;
|
||||
import akka.stream.javadsl.Source;
|
||||
|
|
@ -20,9 +40,11 @@ import akka.stream.javadsl.Source;
|
|||
|
||||
import java.time.Duration;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
|
||||
|
||||
class SourceOrFlow {
|
||||
private static Materializer materializer = null;
|
||||
|
||||
void logExample() {
|
||||
Flow.of(String.class)
|
||||
|
|
@ -46,6 +68,101 @@ class SourceOrFlow {
|
|||
//#zip-with-index
|
||||
}
|
||||
|
||||
void zipExample() {
|
||||
//#zip
|
||||
Source<String, NotUsed> sourceFruits = Source.from(Arrays.asList("apple", "orange", "banana"));
|
||||
Source<String, NotUsed> sourceFirstLetters = Source.from(Arrays.asList("A", "O", "B"));
|
||||
sourceFruits.zip(sourceFirstLetters).runWith(Sink.foreach(System.out::print), materializer);
|
||||
// this will print ('apple', 'A'), ('orange', 'O'), ('banana', 'B')
|
||||
|
||||
//#zip
|
||||
}
|
||||
|
||||
void zipWithExample() {
|
||||
//#zip-with
|
||||
Source<String, NotUsed> sourceCount = Source.from(Arrays.asList("one", "two", "three"));
|
||||
Source<String, NotUsed> sourceFruits = Source.from(Arrays.asList("apple", "orange", "banana"));
|
||||
sourceCount.zipWith(
|
||||
sourceFruits,
|
||||
(Function2<String, String, String>) (countStr, fruitName) -> countStr + " " + fruitName
|
||||
).runWith(Sink.foreach(System.out::print), materializer);
|
||||
// this will print 'one apple', 'two orange', 'three banana'
|
||||
|
||||
//#zip-with
|
||||
}
|
||||
|
||||
void prependExample() {
|
||||
//#prepend
|
||||
Source<String, NotUsed> ladies = Source.from(Arrays.asList("Emma", "Emily"));
|
||||
Source<String, NotUsed> gentlemen = Source.from(Arrays.asList("Liam", "William"));
|
||||
gentlemen.prepend(ladies).runWith(Sink.foreach(System.out::print), materializer);
|
||||
// this will print "Emma", "Emily", "Liam", "William"
|
||||
|
||||
//#prepend
|
||||
}
|
||||
|
||||
|
||||
void concatExample() {
|
||||
//#concat
|
||||
Source<Integer, NotUsed> sourceA = Source.from(Arrays.asList(1, 2, 3, 4));
|
||||
Source<Integer, NotUsed> sourceB = Source.from(Arrays.asList(10, 20, 30, 40));
|
||||
sourceA.concat(sourceB).runWith(Sink.foreach(System.out::print), materializer);
|
||||
//prints 1, 2, 3, 4, 10, 20, 30, 40
|
||||
|
||||
//#concat
|
||||
}
|
||||
|
||||
|
||||
void interleaveExample() {
|
||||
//#interleave
|
||||
Source<Integer, NotUsed> sourceA = Source.from(Arrays.asList(1, 2, 3, 4));
|
||||
Source<Integer, NotUsed> sourceB = Source.from(Arrays.asList(10, 20, 30, 40));
|
||||
sourceA.interleave(sourceB, 2).runWith(Sink.foreach(System.out::print), materializer);
|
||||
//prints 1, 2, 10, 20, 3, 4, 30, 40
|
||||
|
||||
//#interleave
|
||||
}
|
||||
|
||||
|
||||
void mergeExample() {
|
||||
//#merge
|
||||
Source<Integer, NotUsed> sourceA = Source.from(Arrays.asList(1, 2, 3, 4));
|
||||
Source<Integer, NotUsed> sourceB = Source.from(Arrays.asList(10, 20, 30, 40));
|
||||
sourceA.merge(sourceB).runWith(Sink.foreach(System.out::print), materializer);
|
||||
// merging is not deterministic, can for example print 1, 2, 3, 4, 10, 20, 30, 40
|
||||
|
||||
//#merge
|
||||
}
|
||||
|
||||
|
||||
void mergeSortedExample() {
|
||||
//#merge-sorted
|
||||
Source<Integer, NotUsed> sourceA = Source.from(Arrays.asList(1, 3, 5, 7));
|
||||
Source<Integer, NotUsed> sourceB = Source.from(Arrays.asList(2, 4, 6, 8));
|
||||
sourceA.mergeSorted(sourceB, Comparator.<Integer>naturalOrder()).runWith(Sink.foreach(System.out::print), materializer);
|
||||
//prints 1, 2, 3, 4, 5, 6, 7, 8
|
||||
|
||||
Source<Integer, NotUsed> sourceC = Source.from(Arrays.asList(20, 1, 1, 1));
|
||||
sourceA.mergeSorted(sourceC, Comparator.<Integer>naturalOrder()).runWith(Sink.foreach(System.out::print), materializer);
|
||||
//prints 1, 3, 5, 7, 20, 1, 1, 1
|
||||
//#merge-sorted
|
||||
}
|
||||
|
||||
void orElseExample() {
|
||||
//#or-else
|
||||
Source<String, NotUsed> source1 = Source.from(Arrays.asList("First source"));
|
||||
Source<String, NotUsed> source2 = Source.from(Arrays.asList("Second source"));
|
||||
Source<String, NotUsed> emptySource = Source.empty();
|
||||
|
||||
source1.orElse(source2).runWith(Sink.foreach(System.out::print), materializer);
|
||||
// this will print "First source"
|
||||
|
||||
emptySource.orElse(source2).runWith(Sink.foreach(System.out::print), materializer);
|
||||
// this will print "Second source"
|
||||
|
||||
//#or-else
|
||||
}
|
||||
|
||||
void conflateExample() {
|
||||
//#conflate
|
||||
Source.cycle(() -> Arrays.asList(1, 10, 100).iterator())
|
||||
|
|
|
|||
|
|
@ -192,5 +192,18 @@ class FlowConcatSpec extends BaseTwoStreamsSetup {
|
|||
|
||||
probeSink.expectComplete()
|
||||
}
|
||||
|
||||
"work in example" in {
|
||||
//#concat
|
||||
import akka.stream.scaladsl.Source
|
||||
import akka.stream.scaladsl.Sink
|
||||
|
||||
val sourceA = Source(List(1, 2, 3, 4))
|
||||
val sourceB = Source(List(10, 20, 30, 40))
|
||||
|
||||
sourceA.concat(sourceB).runWith(Sink.foreach(println))
|
||||
//prints 1, 2, 3, 4, 10, 20, 30, 40
|
||||
//#concat
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -232,6 +232,19 @@ class FlowInterleaveSpec extends BaseTwoStreamsSetup {
|
|||
up1.expectSubscription().expectCancellation()
|
||||
up2.expectSubscription().expectCancellation()
|
||||
}
|
||||
|
||||
"work in example" in {
|
||||
//#interleave
|
||||
import akka.stream.scaladsl.Source
|
||||
import akka.stream.scaladsl.Sink
|
||||
|
||||
val sourceA = Source(List(1, 2, 3, 4))
|
||||
val sourceB = Source(List(10, 20, 30, 40))
|
||||
|
||||
sourceA.interleave(sourceB, segmentSize = 2).runWith(Sink.foreach(println))
|
||||
//prints 1, 2, 10, 20, 3, 4, 30, 40
|
||||
//#interleave
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,5 +125,36 @@ class FlowMergeSpec extends BaseTwoStreamsSetup {
|
|||
down.expectNext()
|
||||
|
||||
}
|
||||
|
||||
"works in number example for merge sorted" in {
|
||||
//#merge-sorted
|
||||
import akka.stream.scaladsl.Source
|
||||
import akka.stream.scaladsl.Sink
|
||||
|
||||
val sourceA = Source(List(1, 3, 5, 7))
|
||||
val sourceB = Source(List(2, 4, 6, 8))
|
||||
|
||||
sourceA.mergeSorted(sourceB).runWith(Sink.foreach(println))
|
||||
//prints 1, 2, 3, 4, 5, 6, 7, 8
|
||||
|
||||
val sourceC = Source(List(20, 1, 1, 1))
|
||||
|
||||
sourceA.mergeSorted(sourceC).runWith(Sink.foreach(println))
|
||||
//prints 1, 3, 5, 7, 20, 1, 1, 1
|
||||
//#merge-sorted
|
||||
}
|
||||
|
||||
"works in number example for merge" in {
|
||||
//#merge
|
||||
import akka.stream.scaladsl.Source
|
||||
import akka.stream.scaladsl.Sink
|
||||
|
||||
val sourceA = Source(List(1, 2, 3, 4))
|
||||
val sourceB = Source(List(10, 20, 30, 40))
|
||||
|
||||
sourceA.merge(sourceB).runWith(Sink.foreach(println))
|
||||
// merging is not deterministic, can for example print 1, 2, 3, 4, 10, 20, 30, 40
|
||||
//#merge
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,11 @@
|
|||
|
||||
package akka.stream.scaladsl
|
||||
|
||||
//#or-else
|
||||
import akka.stream.scaladsl.Source
|
||||
import akka.stream.scaladsl.Sink
|
||||
|
||||
//#or-else
|
||||
import scala.concurrent.duration._
|
||||
import akka.stream.testkit.Utils.TE
|
||||
import akka.stream.testkit.{ TestPublisher, TestSubscriber }
|
||||
|
|
@ -136,6 +141,20 @@ class FlowOrElseSpec extends AkkaSpec {
|
|||
outProbe.expectError()
|
||||
}
|
||||
|
||||
"work in the example" in {
|
||||
//#or-else
|
||||
val source1 = Source(List("First source"))
|
||||
val source2 = Source(List("Second source"))
|
||||
val emptySource = Source.empty[String]
|
||||
|
||||
source1.orElse(source2).runWith(Sink.foreach(println))
|
||||
// this will print "First source"
|
||||
|
||||
emptySource.orElse(source2).runWith(Sink.foreach(println))
|
||||
// this will print "Second source"
|
||||
//#or-else
|
||||
}
|
||||
|
||||
trait OrElseProbedFlow {
|
||||
val inProbe1 = TestPublisher.probe[Char]()
|
||||
val source1 = Source.fromPublisher(inProbe1)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* Copyright (C) 2016-2018 Lightbend Inc. <https://www.lightbend.com>
|
||||
*/
|
||||
|
||||
package akka.stream.scaladsl
|
||||
|
||||
//#prepend
|
||||
import akka.stream.scaladsl.Source
|
||||
import akka.stream.scaladsl.Sink
|
||||
|
||||
//#prepend
|
||||
import akka.stream.{ ActorMaterializer, ActorMaterializerSettings }
|
||||
import akka.testkit.AkkaSpec
|
||||
|
||||
class FlowPrependSpec extends AkkaSpec {
|
||||
|
||||
val settings = ActorMaterializerSettings(system)
|
||||
|
||||
implicit val materializer = ActorMaterializer(settings)
|
||||
|
||||
"An Prepend flow" should {
|
||||
|
||||
"work in entrance example" in {
|
||||
//#prepend
|
||||
val ladies = Source(List("Emma", "Emily"))
|
||||
val gentlemen = Source(List("Liam", "William"))
|
||||
|
||||
gentlemen.prepend(ladies).runWith(Sink.foreach(println))
|
||||
// this will print "Emma", "Emily", "Liam", "William"
|
||||
//#prepend
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,12 @@
|
|||
|
||||
package akka.stream.scaladsl
|
||||
|
||||
//#zip
|
||||
import akka.stream.scaladsl.Source
|
||||
import akka.stream.scaladsl.Sink
|
||||
|
||||
//#zip
|
||||
|
||||
import akka.stream.testkit.Utils._
|
||||
import akka.stream.testkit.scaladsl.StreamTestKit._
|
||||
import akka.stream.testkit.{ BaseTwoStreamsSetup, TestSubscriber }
|
||||
|
|
@ -70,5 +76,15 @@ class FlowZipSpec extends BaseTwoStreamsSetup {
|
|||
val subscriber2 = setup(nonemptyPublisher(1 to 4), soonToFailPublisher)
|
||||
subscriber2.expectSubscriptionAndError(TestException)
|
||||
}
|
||||
|
||||
"work in fruits example" in {
|
||||
//#zip
|
||||
val sourceFruits = Source(List("apple", "orange", "banana"))
|
||||
val sourceFirstLetters = Source(List("A", "O", "B"))
|
||||
sourceFruits.zip(sourceFirstLetters).runWith(Sink.foreach(println))
|
||||
// this will print ('apple', 'A'), ('orange', 'O'), ('banana', 'B')
|
||||
//#zip
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,12 @@
|
|||
|
||||
package akka.stream.scaladsl
|
||||
|
||||
//#zip-with
|
||||
import akka.stream.scaladsl.Source
|
||||
import akka.stream.scaladsl.Sink
|
||||
|
||||
//#zip-with
|
||||
|
||||
import akka.stream.testkit.{ BaseTwoStreamsSetup, TestSubscriber }
|
||||
import org.reactivestreams.Publisher
|
||||
import scala.concurrent.duration._
|
||||
|
|
@ -91,6 +97,18 @@ class FlowZipWithSpec extends BaseTwoStreamsSetup {
|
|||
subscriber2.expectSubscriptionAndError(TestException)
|
||||
}
|
||||
|
||||
"work in fruits example" in {
|
||||
//#zip-with
|
||||
val sourceCount = Source(List("one", "two", "three"))
|
||||
val sourceFruits = Source(List("apple", "orange", "banana"))
|
||||
|
||||
sourceCount.zipWith(sourceFruits) {
|
||||
(countStr, fruitName) ⇒
|
||||
s"$countStr $fruitName"
|
||||
}.runWith(Sink.foreach(println))
|
||||
// this will print 'one apple', 'two orange', 'three banana'
|
||||
//#zip-with
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue