本文按我自己理解的内容进行叙述,可能不具有普遍性:
概念: 柯里化(currying, 以逻辑学家Haskell Brooks Curry的名字命名)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程,新的函数返回一个以原有第二个参数作为参数的函数。 在Scala中方法和函数有细微的差别,通常编译器会自动完成方法到函数的转换 。
1、简单来说就是把fun(String x, String y)转为需要两次调用方法执行的操作,第一次传递一个参数然后赋值给一个对象,当第二次传递参数的时候就会执行fun当中的代码。参数应该从左到右依次赋值。
普通函数并不支持柯里化的功能,需要使用scala当中的语法糖进行转换
语法糖:
val fun = 函数名 _
参考柯里化过程https://blog.csdn.net/qq_41851454/article/details/80032321
代码逻辑示例:
def mysum(x:Int)(y:Int): Int = {println(x);x+ y} // 该方法不能使用def mysum(x:Int, y:Int):Int = {x+y} // 执行语法糖操作 val f1 = mysum _ // 第一次调用函数 val f2 = f1(1) println(f2) // 第二次调用函数 val result = f2(3) // 打印结果 println("the result is "+result)
2、 语句的说明
val aaa:List[Int] = List(1, 2, 3, 4, 1, 6) val bb = aaa.map((_,1)).groupBy(_._1).mapValues(_.length).toList.sortBy(-_._2) val bb = aaa.map((_,1)) //注释:_表示aaa当中的每一个元素 // (_,1)表示组成一个(元素,1)的元组 // 结果:(1, 1) (2, 1) (3, 1) (4, 1) (1, 1) (6, 1) .groupBy(_._1) // 表示将元组里面的每个元素的第一个参数进行分组 // 结果:与mapvalues一起 .mapValues(_.length) // 表示将分组后的元素进行map化 // (1, 2) (2, 1) (3, 1) (4, 1) (6, 1) .toList.sortBy(-_._2) // 将map转换为list元组 // List((1,2), (6,1), (2,1), (3,1), (4,1)) // -_._2表示使用list中每个元素的第二个参数进行排序