6

我试图编写这 3 个代码但没有成功:

aList.foldLeft(List()){(accu, element) => map.get(elment):::accu}
aList.foldLeft(List()){(accu, element) => if (!map.get(element).isEmpty) map.get(element):::accu}
aList.foldLeft(List()){(accu, element) => map.get(elment).exists(_:::accu)}

有谁知道如何将选项连接到列表?

4

4 回答 4

26

要将选项与列表连接起来,您可以这样做option.toList ++ list

将 aOption[List[A]]与 a连接List[A] optionOfList.toList.flatten ++ list

基本思想是您始终可以将选项转换为 0 或一个元素的列表,这使得以不同方式将它们与列表组合起来很容易。

于 2012-10-13T04:12:56.207 回答
1

撒一些scalaz

import scalaz._; import Scalaz._

并设置:

scala> val optList = some(List(1, 2, 3, 4)
optList: Option[List[Int]] = Some(List(1, 2, 3, 4))

scala> val list = List(5, 6, 7)
list: List[Int] = List(5, 6, 7)

然后我可以这样做:

scala> ~optList ::: list
res0: List[Int] = List(1, 2, 3, 4, 5, 6, 7)

基本上~是附加到类型为零Option[A]的一元方法。列表的当然是,ANil

于 2012-10-13T11:18:00.020 回答
1

如果您想在列表末尾添加一个选项,那么只需使用List.++

val ss = Seq(1,2)   // ss: Seq[Int] = List(1, 2)
ss ++ Option(3)     // res0: Seq[Int] = List(1, 2, 3)
于 2019-09-04T09:33:32.500 回答
0

@oxbow_lakes 和 @rjsvaljean 的答案非常好,但他们仍然错过了一个可以通过非常惯用的 Scala 解决的可能情况:

scala> List(1,2,3)
res6: List[Int] = List(1, 2, 3)

scala> Option(List(5,6,7))
res7: Option[List[Int]] = Some(List(5, 6, 7))

scala> for (l<-res7) yield l ++ res6
res8: Option[List[Int]] = Some(List(5, 6, 7, 1, 2, 3))

scala> for(l<-(None:Option[List[Int]])) yield l ++ res6
res9: Option[List[Int]] = None

上面代码所示的缺失案例应该是NoneyieldNone而不是Nil?

于 2012-10-13T11:31:53.800 回答