Reputation: 597
I have a stream having a huge bunch of either values in it. I am looking for an itiomatic way to filter out the Either-Left and map on the Either-Right. I want to avoid something like
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)
This is some a minimal example. Since my stream is very long this is becomming messy and it doesn't feel like a good approach.
Btw the same applies to Option[T] in my case.
Upvotes: 5
Views: 1731
Reputation: 149538
You're looking for Flow.collect
:
Source(eithers)
.collect { case Foo(Right(x), y) => (x, y) }
.map { case (x, y) => doSomethingWith(x, y) }
.runWith(Sink.seq)
collect
, similar to the Scala library, applies the partial function to all elements and returns these which yield true for it's isDefined
method.
Upvotes: 2