akka.stream.scaladsl.Source 中 reduce 和 runReduce 的区别?

Difference between reduce and runReduce in akka.stream.scaladsl.Source?

akka.stream.scaladsl.Source.reduce() 和 runReduce() 函数有什么区别?

我在这里查看 https://doc.akka.io/api/akka/current/akka/stream/scaladsl/Source.html 很明显 reduce() 使用第一个元素作为“基础”“折叠”所有元素。我不太明白将 runReduce() 用于 运行 这个 Sourcereduce() 函数有什么好处。为什么它 return 一个 Future?

执行 akka 流需要 2 个步骤:

  • 构建蓝图
  • 运行它(so-called实现)

reduce 只做第 1 步,runReduce 做第 1 步和第 2 步。

import akka.actor.ActorSystem
import akka.stream.scaladsl._
import scala.util.{Failure, Success}
import scala.concurrent.ExecutionContext.Implicits.global

implicit val actorSystem = ActorSystem("example")

// reduce
Source(1 to 10).reduce(_ + _).runForeach(println).onComplete {
  case Success(v) => println("done")
  case Failure(e) => println(e.getMessage)
}
// it prints:
// 55
// done

// runReduce
Source(1 to 10).runReduce(_ + _).onComplete {
  case Success(v) => println(v)
  case Failure(e) => println(e.getMessage)
}
// it prints:
// 55

随时尝试 playground 中的示例 https://scastie.scala-lang.org/2Iure8pDSUWcLjFVGflyUQ