列表的Scala交集和列表的选项

时间:2016-03-28 04:08:52

标签: scala intersect

当我遇到这个时,我正试图对scala REPL做点什么。假设我有一个列表说

val list1:List[String]=List("test1","test2")

我有类似的东西

val list2:Option[List[String]]=Some(List("test1"))

我正在尝试交叉方法并尝试了这个

list2.getOrElse(List.empty).intersect(list1)

我期待结果是List(" test1")而不是我有一个空列表。我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

嗯。我无法重现这个问题:

Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_31).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val list1:List[String]=List("test1","test2")
list1: List[String] = List(test1, test2)

scala> val list2:Option[List[String]]=Some(List("test1"))
list2: Option[List[String]] = Some(List(test1))

scala> list2.getOrElse(List.empty).intersect(list1)
res0: List[String] = List(test1)

答案 1 :(得分:1)

使用fold可能是一种更惯用的方法。

scala> :pa
// Entering paste mode (ctrl-D to finish)

val list1:List[String]=List("test1","test2")
val list2:Option[List[String]]=Some(List("test1"))  // first try it with Some()

// Exiting paste mode, now interpreting.

list1: List[String] = List(test1, test2)
list2: Option[List[String]] = Some(List(test1))

scala> list2.fold(List[String]()){_.intersect(list1)}
res22: List[String] = List(test1)

scala> val list2:Option[List[String]]=None  // now try it with None
list2: Option[List[String]] = None

scala> list2.fold(List[String]()){_.intersect(list1)}
res23: List[String] = List()