如何结束无限的akka​​流

时间:2015-11-01 12:55:14

标签: scala terminate akka-stream

我是Akka Streams的新手,但有一个案例我想用它来寻找无限来源的排列。有限源的简化示例可能如下所示。

val future = Source(1 to 100)
    .map { i => if (i % 20 == 0) println(i); i }
    .filter(_ == 42)
    .runWith(Sink.fold[Int, Int](0)(Keep.right))

这个例子输出:

20
40
60
80
100

我很明显来源已经过了42,但我不想在获得结果之前耗尽整个流。

val result: Int = Await.result(future, 1.second)
result should be(42)

问题是,当我找到我正在寻找的内容时,我应该如何结束流?

2 个答案:

答案 0 :(得分:4)

val future = Source(1 to 100)
    .map { i => if (i % 20 == 0) println(i); i }
    .filter(_ == 42)
    .runWith(Sink.head)

答案 1 :(得分:2)

推广到N值,例如如果10个值大于或等于42,您可以使用grouped

val N = 10

val future : Future[Seq[Int]] = 
  Source(1 to 100).map { i => if (i % 20 == 0) println(i); i }
                  .filter(_ >= 42)
                  .grouped(N)
                  .runWith(Sink.head)