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

Scala Intersection of List and Option of list

当我遇到这个时,我正试图在 scala REPL 上做一些事情。假设我有一个列表说

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

我有这样的东西

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

我正在尝试 intersect 方法并尝试了这个

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

我期望结果是 List("test1") 而不是我得到一个空列表。我在这里错过了什么?

嗯。我无法重现问题:

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)

使用 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()