过滤掉akka流中的“要么左”的惯用方式是什么?

时间:2018-06-29 07:13:11

标签: scala akka akka-stream either

我有一个流,其中包含大量的两个值。我正在寻找一种过滤方法,以过滤掉Either-Left并在Either-Right上进行映射。我想避免类似

final case class Foo(x: Either[String, Int], y:Int)

val foos = functionReturningSeqOfFoo()

Source(foos)
  .filter(_.x.isRight)
  .map(foo => (foo.x.right.get, foo.y))
  .map { case (x, y) =>
    doSomethingWith(x, y)
  }
  .runWith(Sink.seq)

这是一个最小的示例。由于我的信息流很长,因此变得一团糟,而且感觉不太好。

在我的情况下,这同样适用于Option [T]。

2 个答案:

答案 0 :(得分:3)

您可以使用collect

Source(foos).collect { case Foo(Right(x), y) => (x, y) }

或使用以下方法直接转换元组:

Source(foos).collect { case Foo(Right(x), y) => doSomethingWith(x, y) }

collect将删除所有未定义部分功能的对象。

答案 1 :(得分:1)

您正在寻找Flow.collect

Source(eithers)
 .collect { case Foo(Right(x), y) => (x, y) }
 .map { case (x, y) => doSomethingWith(x, y) }
 .runWith(Sink.seq)

collect与Scala库类似,将部分函数应用于所有元素,并返回其isDefined方法产生true的元素。