取列表中满足条件的元素
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)
}
没有那么更多的代码。
我有一个 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)
}
没有那么更多的代码。