我想压缩两个列表并进行模式匹配,但似乎zip和match产生错误。我不明白为什么会有这样的错误。
以下示例是简化版本。
这有效
val l = List((1, 2), (3, 4), (5, 6))
l.map { case(a, b) => println(s"First is $a, second is $b") }
这不起作用
val l1 = List(1,2,3)
val l2 = List(4,5,6)
l1.zip(l2)
l1.zip(l2).map { case(a, b) => a match {case 1 => println(s"First is $a, second is $b") }}
错误信息
scala.MatchError: 2 (of class java.lang.Integer)
at .$anonfun$res15$1(<console>:14)
at .$anonfun$res15$1$adapted(<console>:14)
at scala.collection.immutable.List.map(List.scala:287)
... 28 elided
答案 0 :(得分:2)
zip
可以与match
一起使用,但是如果您使用map()
,则必须为您将要遇到的所有条件提供匹配。这是默认case
派上用场的地方。
如果您真的只对case
a == 1
感兴趣,并且您只是想忽略所有其他条件,那么请使用collect()
代替map()
l1.zip(l2).collect{case (1, b) => println(s"First is 1, second is $b")}
这是有效的,因为collect()
将部分函数作为其参数,因此匹配其case
的输入是好的,其他一切都被忽略。另一方面,map()
采用函数(非部分)作为参数,这意味着它必须接受并处理所有输入,因此如果您使用模式匹配,则必须匹配各种情况。
答案 1 :(得分:0)
您的编译器应该很好地警告&#34;您缺少默认模式匹配,即case _ =>
&#34;。
它与zip
无关,而是与&#34;模式匹配&#34;无关。
工作示例;
scala> List(1,2,3).zip(List(4,5,6)).map { case(a, b) =>
a match {case 1 => println(s"First is $a, second is $b")
case _ => println("Oops I missed it")}}
First is 1, second is 4
Oops I missed it
Oops I missed it
res5: List[Unit] = List((), (), ())
此外,如果您只是打印,使用foreach
功能而不是map
,因为数学地图应该会返回一些数据。 foreach
是火,忘了。
scala> List(1,2,3).zip(List(4,5,6)).foreach { case(a, b) =>
a match {
case 1 => println(s"First is $a, second is $b")
case _ => println("Oops I missed it")}}
First is 1, second is 4
Oops I missed it
Oops I missed it
答案 2 :(得分:-2)
您缺少一对全部
的括号@ val list1 = List(1, 2, 3)
val llist1: List[Int] = List(1, 2, 3)
@ val list2 = List(5, 6, 7)
lislist2: List[Int] = List(5, 6, 7)
@ list1.zip(list2)
res2: List[(Int, Int)] = List((1, 5), (2, 6), (3, 7))
@ list1.zip(list2) foreach { case ((a, b)) => println(s"first is $a and then is $b") }
此输出
first is 1 and then is 5
first is 2 and then is 6
first is 3 and then is 7
代码与您编写的内容相同,只是我使用了一个额外的(
和)
来修补元组。