如何优雅地将Option [List]连接到List?

时间:2012-10-13 04:01:59

标签: scala

我试着编写这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)}

有没有人知道如何将Option连接到列表?

的UE

4 个答案:

答案 0 :(得分:24)

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

Option[List[A]]List[A] optionOfList.toList.flatten ++ list

连接起来

基本的想法是,您始终可以将选项转换为0或一个元素的列表,这样可以轻松地以不同方式将它们与列表组合。

答案 1 :(得分: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]的一元方法,其中{em> 0 类型为A。列表的当然是Nil

答案 2 :(得分:1)

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

val ss = Seq(1,2)   // ss: Seq[Int] = List(1, 2)
ss ++ Option(3)     // res0: Seq[Int] = List(1, 2, 3)

答案 3 :(得分: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

上述代码所示的缺失案例应该None收取None而不是Nil