在 Kotlin 中如何将方法绑定到名称?

问题描述

在 Kotlin 中,代码片段 val f = println()函数 println(它是第一类对象)绑定到名称 f

如何对方法 map 执行相同操作,即将其存储在 f 中?

语法 val f = map 不起作用,val f = arrayOf(1,2,3).map 也不起作用。我尝试了上述的各种变体,但都没有成功。

另外(和相关的),为什么 val f = println 不起作用,需要括号?我来自函数式编程阵营(Scheme),在那里这绝对是正常的。

(免责声明:绝对 Kotlin 新手,努力自学。)

解决方法

在 Kotlin 中,代码片段 val f = println() 将函数 println(它是第一类对象)绑定到名称 f

不是真的。这将调用 println() 的返回值结果,即 Unit,分配给变量 f。要获取函数引用,请使用 ::。但是还必须指定变量类型,因为函数有重载时无法推断:

val f: (Any)->Unit = ::println

应使用接收类型指定带有接收器的函数,例如

val f = Any::toString

// or,to bind a specific instance's toString:
val myList = listOf("Hello","World")
val myListToString = myList::toString

由于 map 是一个高阶函数,它有一个长而复杂的签名:

val f: Array<Int>.((Int)->String)->List<String> = Array<Int>::map