首页 > 解决方案 > akka.stream.scaladsl.Source 中 reduce 和 runReduce 的区别?

问题描述

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

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

标签: akka-stream

解决方案


您需要 2 个步骤来执行 akka 流:

  • 构建蓝图
  • 运行它(所谓的物化)

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

随意在操场上尝试示例https://scastie.scala-lang.org/2Iure8pDSUWcLjFVGflyUQ


推荐阅读