Что такое идиоматический способ отфильтровать Either Left в потоке akka? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть поток с огромным количеством значений. Я ищу идиоматический способ отфильтровывать либо левые, либо карту на правых сторонах. Я хочу избежать чего-то вроде

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)

Это минимальный пример. Так как мой поток очень длинный, это становится грязным, и это не похоже на хороший подход.

Кстати, то же самое относится и к варианту [T] в моем случае.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вы можете использовать собирать :

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

или непосредственное преобразование кортежа с помощью:

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

collect удалит все объекты, для которых не определена частичная функция.

0 голосов
/ 29 июня 2018

Вы ищете Flow.collect:

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

collect, подобно библиотеке Scala, применяет частичную функцию ко всем элементам и возвращает их, что дает true для его метода isDefined.

...