Scala列表与列表选项的交集
我正试图在scala REPL上做些什么,突然遇到了这个。假设我有一张清单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”),但得到的却是一个空列表。我在这里遗漏了
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,然后再次打开它。