函数引用
如果我们有一个命名函数声明如下:
fun isOdd(x: Int) = x % 2 != 0
我们可以简单直接的调用它(isOdd(5)),但是我们也可以将其作为值进行传递,比如,传递到另一个函数。此时我们需要使用::操作符:
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // prints [1, 3]
这里的::isOdd是一个函数类型的值 (Int) -> Boolean。
::可以被用在重载函数中,此时函数类型可以根据上下文进行确定,比如:
fun isOdd(x: Int) = x % 2 != 0
fun isOdd(s: String) = s == "brillig" || s == "slithy" || s == "tove"
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // refers to isOdd(x: Int)
另外你也可以通过存储方法引用在一个变量中来提供一个必要的上下文,这样可以显示的指定类型:
val predicate: (String) -> Boolean = ::isOdd // refers to isOdd(x: String)
如果你需要使用类的成员,或者是扩展函数,需要进行限制。比如,String::toCharArray返回String : String.() -> CharArray的扩展函数类型。