Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala列表与列表选项的交集_Scala_Intersect - Fatal编程技术网

Scala列表与列表选项的交集

Scala列表与列表选项的交集,scala,intersect,Scala,Intersect,我正试图在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”),但得到的却是一个空列表。我在这里遗漏了

我正试图在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)

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

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

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

您的代码返回您所期望的结果,没有任何问题。我认为
list2.map(u.intersect(list1))。getOrElse(List.empty)
更符合逻辑。对于
None
,没有
intersect
。这似乎是一个很好的选择。您的代码返回您期望的结果,没有任何问题。我认为
list2.map(u.intersect(list1))。getOrElse(List.empty)
更符合逻辑。对于
None
,没有
intersect
。这似乎是一个不错的选择。我似乎正在使用scala 2.10.4。你认为这是wrt scala版本的问题吗?@Rakshith否-我刚刚在2.10.4中尝试了这个,它给出了你期望的结果。似乎突然之间它工作正常。我关闭了repl并再次打开它。我似乎在使用scala 2.10.4。你认为这是wrt scala版本的问题吗?@Rakshith否-我刚刚在2.10.4中尝试了这个,它给出了你期望的结果。似乎突然之间它工作正常。我关闭了repl,然后再次打开它。