【发布时间】:2018-11-07 13:13:14
【问题描述】:
我对一个字符串列表进行了一些数据转换,我得到了一个 Either 列表,其中 Left 表示错误,Right 表示成功转换的项目。
val results: Seq[Either[String, T]] = ...
我将结果划分为:
val (errors, items) = results.partition(_.isLeft)
在做一些错误处理后,我想返回一个Seq[T] 的有效项目。这意味着,返回所有 Right 元素的值。由于分区,我已经知道项目Right 的所有元素。我想出了五种可能的方法。但是什么是可读性和性能最好的呢?在 Scala 中是否有一种惯用的方法?
// which variant is most scala like and still understandable?
items.map(_.right.get)
items.map(_.right.getOrElse(null))
items.map(_.asInstanceOf[Right[String, T]].value)
items.flatMap(_.toOption)
items.collect{case Right(item) => item}
【问题讨论】:
-
items.collect ...在这里似乎是个不错的选择。 -
你能避开中间的
Right吗?collect似乎很麻烦,get似乎很危险/不必要。 -
您可能有兴趣使用 Cats Validated 来累积错误或结果 (typelevel.org/cats/datatypes/validated.html) - 您可以避免使用
Either所需的样板,例如分区和不必要的.get调用。 -
items.flatMap(_.toOption)在我的测试中运行良好,是一个干净易懂的解决方案。