取列表中满足条件的元素

Take the element in a list that satisfy a condition

我有一个 List[Either[Error, Satisfaction]],我需要获取该列表中的第一个元素 isRight。如果没有满足isRight的元素,那么我应该return最后一个Error.

现在我考虑了 takeWhile(_.isLeft),找到最后一个列表的大小,然后得到原始列表中的第 n 个元素,其中 n first-lefts 列表的大小,但我认为对此有更好的解决方案。

非常感谢任何帮助。

您可能 reduce 列表如下:

lst.reduceLeft((a,b) => if (a.isRight) a else b)

结果将是第一个 Right 元素,如果有 none,则结果将是最后的 Left 元素。

你可以这样做,这与@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)
}

没有那么更多的代码。