为什么zip不适用于Scala中的匹配大小写?

时间:2018-02-28 01:22:42

标签: scala

我想压缩两个列表并进行模式匹配,但似乎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

3 个答案:

答案 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

同时阅读 - Scala case match default value

Chapter - 9, Pattern matching/ stackoverflow doc

答案 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

代码与您编写的内容相同,只是我使用了一个额外的()来修补元组。