Kotlin中的::操作符详解
Kotlin提供了::操作符,用于创建对类或对象的成员(函数、属性)的引用。这种机制叫做成员引用(Member Reference)。这是Kotlin高阶函数和函数式编程的重要组成部分。
简化函数传递
在Java中,我们这样传方法:
list.forEach(item -> System.out.println(item));
而在Kotlin中,可以写成:
val list = listOf("Apple","Banana","Cherry")list.forEach(::println)
::println 表示把 println 当作一个函数对象传进去,而不是调用它,就是一种函数引用。
常见用法分类
1.引用类的成员函数或属性
val length:(String) ->Int = String::length
val toUpperCase:(String) ->String = String::toUpperCase
等价于
val length:(String) -> Int = {it.length
}
val toUpperCase:(String) -> String = {it.toUpperCase()
}
2.引用构造函数
class Person{
}
val createPerson: () -> Person = ::Person
等价于:
val createPerson: () -> Person = {Person()}
3.引用顶层函数
定义一个函数
fun sayHello(name:String){println("Hello,$name")
}
引用方式
val greet:(String) -> Unit = ::sayHello
fun main() {greet("Tom")
}
4.引用扩展函数
fun String.isLong() = this.length > 10val check:(String) -> Boolean = String::isLong
5.获取类的KClass对象(关键字class)
val clazz = String::class
这里与函数引用的::不同,获取的是类元信息
实际使用场景
作为高阶函数参数
data class User(val name: String)
val users = listOf(User("Alice"),User("Bob"))val names = users.map(User::name)
fun main() {println(names)
}
绑定实例方法
data class User(val name: String)
val users = User("Mike")
val getName: () -> String = users::namefun main() {println(getName())
}
底层原理简述
val func = String::lengthfun main(){println(func("Hello"))
}
kotlin编辑器会生成一个实现了相应函数接口的对象
val func = fun(s:String):Int = s.length
等价于
fun myFunction(s: String): Int {return s.length
}
这些引用在编译期就能被识别并优化