在Akka Streams中,Keep.right和Keep.left是用于保留导出流和链式流操作结果中的特定部分。但是,这些特殊的流操作对许多流式计算场景并没有实际影响。
例如,下面的示例显示了一个使用Keep.right的简单的map操作。该操作使用一个函数将值乘2,并且使用Keep.right在跨越flatMap操作时保留了原始输入元素。但是,即使不使用Keep.right,结果也是一样的。
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl._
object KeepRightExample {
implicit val system = ActorSystem("KeepRightExample")
implicit val materializer = ActorMaterializer()
val source = Source.fromIterator(() => Iterator.range(1,4))
val numberMultiplier = Flow[Int].map(n => n * 2)
val sumSink = Sink.fold[Int, Int](0)(_ + _)
// using Keep.right
source
.via(numberMultiplier)
.viaMat(sumSink)(Keep.right)
.run()
// same as above but without using Keep.right
source
.via(numberMultiplier)
.runWith(sumSink)
}
因此,可以放心地在Akka Streams 中使用 Keep.right / Keep.left 操作,因为不使用这些操作也可以获得相同的结果。