我有一个流,其中包含大量的两个值。我正在寻找一种过滤方法,以过滤掉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]。
答案 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的元素。