压缩操作后进行映射和压缩后进行映射有什么区别?

时间:2018-07-09 21:18:06

标签: scala intellij-idea

我知道它与Intellij(IntelliJ Community 2018)中元组的使用或错误有关,因为它报告了两种映射方法都需要f:(Int,String)=> B,但是当我提供这样的功能时,它告诉我我编译失败:

List(1, 2, 3).zip(List ("a", "b", "c")).map((a, b) => "blah") //this does not compile 
(List(1, 2, 3), List("a", "b", "c")).zipped.map((a, b) => "blah") //this compiles

enter image description here

2 个答案:

答案 0 :(得分:3)

List(1, 2, 3).zip(List ("a", "b", "c"))创建一个List[(Int, String)]。在.map上调用List时,必须传递一个仅带有一个参数的函数,在本例中为一个元组:(Int, String)。您需要一个((Int, String)) => B

(List(1, 2, 3), List("a", "b", "c")).zipped创建一个Tuple2Zipped[Int, List[Int], String, List[String]]。该类的.map方法必须提供一个带有两个参数的函数,其中第一个为Int,第二个为String。您需要一个(Int, String) => B

(a, b) => "blah"是接受两个参数的函数的有效语法,而不是接受带有一个元组的单个参数的函数的有效语法。因此,对于后者,但对于前者,则没问题。

答案 1 :(得分:0)

这不是错误,您可以尝试在其他位置(例如playgrund here)上编译表达式。

对于您的情况,

List(1, 2, 3).zip(List ("a", "b", "c")).map((a, b) => "blah")

应改写为:

List(1, 2, 3).zip(List ("a", "b", "c")).map({case(a, b) => "blah"})

您应该元组 List(1, 2, 3).zip(List ("a", "b", "c"))部分,使其能够像(a, b)一样使用。

有关详细说明,请参见this post