这是怎么回事:
List(1,2,3).zipWithIndex.map((tup) => tup match {case (v, i) => if (i == 1) 777 else v})
可以简化为:
List(1,2,3).zipWithIndex.map({case (v, i) => if (i == 1) 777 else v})
换句话说,{}
块可以代替一个函数吗?当从未指定应该执行此操作时,如何指示scala对{}
块的输入执行匹配?反正{}
块到底是什么?
答案 0 :(得分:6)
一个块(只是{}
)不是一个函数,它是一个表达式(这个是Unit类型的)。
以下代码是一个表达式,一旦求值,该表达式将返回Function1或PartialFunction(如您所见,它具有一个参数)。
{ case (v, i) => if (i == 1) 777 else v }
您可以将其分配给变量(函数是对象)
val f1:Function1[Tuple2[Int, Int], Int] = { case (v, i) => if (i == 1) 777 else v }
val f2:PartialFunction[Tuple2[Int, Int], Int] = { case (v, i) => if (i == 1) 777 else v }
由于类型推断,因此无需为函数参数设置类型。在我的示例中,我的val类型为我提供了这些类型。在您的示例中,您的map
需要(Int, Int) => Int
,然后编译器会推断出该类型。
您也可以写
List(1, 2, 3).zipWithIndex.map { case (v, i) => if (i == 1) 777 else v }
如果要与功能参数(大小写)一起使用模式匹配,则必须使用{}
。
如果没有case
,则无需使用{}
List(1, 2, 3).zipWithIndex.map( p => if(p._2 == 1) 777 else p._1 )