获取满足条件的列表中的元素

时间:2017-06-15 19:21:22

标签: scala scala-collections

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

现在我想到takeWhile(_.isLeft),找到最后一个列表的大小,然后获取原始列表中的n元素,其中n是大小第一个列表,但我认为这是一个更好的解决方案。

非常感谢任何帮助。

2 个答案:

答案 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)
}

更多代码。