我有List[Either[Error, Satisfaction]]
,我需要将该列表中的第一个元素isRight
。如果没有满足isRight
的元素,那么我应该返回最后一个Error
。
现在我想到takeWhile(_.isLeft)
,找到最后一个列表的大小,然后获取原始列表中的n
元素,其中n
是大小第一个列表,但我认为这是一个更好的解决方案。
非常感谢任何帮助。
答案 0 :(得分:3)
您可以reduce
列表如下:
lst.reduceLeft((a,b) => if (a.isRight) a else b)
结果将是第一个Right
元素,如果没有,则为最终的Left
元素。
答案 1 :(得分:2)
你可以这样做,这对@jwvh的回答有双重问题:如果rest
为空,则必须再次检查列表。
val (lefts, rest) = list.span(_.isLeft)
rest.headOption.getOrElse(lefts.last)
// or orElse(lefts.lastOption) if list can be empty
并且递归解决方案没有任何完整性问题(假设非空列表):
def foo(list: List[Either[Error, Satisfaction]]) = list match {
case x :: tail => if (x.isRight || tail.isEmpty) x else foo(tail)
}
不 更多代码。