gpt4 book ai didi

scala - 如何将“Either”列表转换为“Right”值列表?

转载 作者:行者123 更新时间:2023-12-03 16:51:43 26 4
gpt4 key购买 nike

我对字符串列表进行了一些数据转换,并得到了一个列表,其中 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}

最佳答案

使用 .get被认为是“代码异味”:在这种情况下它会起作用,但会让代码的阅读者暂停并花费一些额外的“周期”以“证明”它是可以的。最好避免使用诸如 .get 之类的东西。在 EitherOption.applyMapIndexedSeq .
.getOrElse没问题...但是null不是你经常在 Scala 代码中看到的东西。再次,让读者停下来思考“为什么会在这里?如果它最终返回 null 会发生什么?”等等。最好也避免。
.asInstanceOf是……不好。它打破了类型安全性,只是......不是scala。

那留下.flatMap(_.toOption).collect .两者都很好。我个人更喜欢后者,因为它更明确一些(并且不会让读者停下来记住 Either 是有偏见的方式)。

您也可以使用 foldRight一次性完成分区和提取:

 val (errors, items) = results.foldRight[(List[String], List[T])](Nil,Nil) { 
case (Left(error), (e, i)) => (error :: e, i)
case ((Right(result), (e, i)) => (e, result :: i)
}

关于scala - 如何将“Either”列表转换为“Right”值列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53190188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com