我有一系列左右值,例如:
val l: Seq[Either[Error, Data]] = Seq(Left(Error), Right(Data), ...)
我想映射所有Right值并顯示Left. 我試過了:
val data: Seq[Data] = l.flatMap {
case Right(data) => data
case Left(err) => println(err) // doesn't work because println is Unit
}
有沒有辦法做到這一點?
uj5u.com熱心網友回復:
像這樣混合副作用和純代碼通常不是一個好習慣,但類似于(假設是 strict Seq):
def rightsAfterEffectingLefts[A, B](eithers: Seq[Either[A, B]])(effect: A => Unit): Seq[B] = {
eithers.foreach(_.left.foreach(effect))
eithers.flatMap(_.toOption)
}
val data = rightsAfterEffectingLefts(l)(println _)
可以優化以避免雙重迭代,但您可能希望以不同的方式處理不同的Seq實作。
編輯:在路易斯的建議之后
def rightsAfterEffectingLefts[A, B](eithers: Seq[Either[A, B]])(effect: A => Unit): Seq[B] = {
val (lefts, rights) = eithers.partition(_.isLeft)
lefts.foreach(_.left.foreach(effect))
rights.flatMap(_.toOption)
}
是另一種定義。它仍然重復兩次并且可能會更慢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347928.html
上一篇:java.lang.NoClassDefFoundError:scala/collection/convert/DecorateAsScala但pom.xml中的scala-library在JBoss
