{}块在scala中如何表示一个函数?

时间:2018-09-26 17:15:01

标签: scala

这是怎么回事:

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对{}块的输入执行匹配?反正{}块到底是什么?

1 个答案:

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