双冒号操作符
1、引用顶层函数
funisOdd(x:Int)=x%2!=0valnumbers=listOf(1,2,3)valoddNumbers=numbers.filter(::isOdd)println(oddNumbers)
// 等价于funisOdd(x:Int)=x%2!=0valnumbers=listOf(1,2,3)valoddNumbers=numbers.filter{isOdd(it)}println(oddNumbers)
2、引用成员函数
- 未绑定引用
【类名】::【成员函数】
vallist=listOf("a","bb","ccc")vallengths=list.map(String::length)println(lengths)
// 等价于vallist=listOf("a","bb","ccc")vallengths=list.map{it.length}println(lengths)
dataclassPerson(valname:String,valage:Int)vallist=listOf(Person("Alice",25),Person("Bob",30))valnames=list.map(Person::name)println(names)
// 等价于dataclassPerson(valname:String,valage:Int)vallist=listOf(Person("Alice",25),Person("Bob",30))valnames=list.map{it.name}println(names)
- 已绑定引用
【对象实例】::【成员函数】
dataclassPerson(valname:String,valage:Int)valp=Person("Alice",25)valnameGetter=p::nameprintln(nameGetter())
3、引用构造函数
dataclassPerson(valname:String,valage:Int)valcreatePerson=::Personvalp=createPerson("Alice",25)println(p)
4、引用属性
varcount=0funmain(){valcountProperty=::countprintln(countProperty.get())countProperty.set(5)println(count)}
- 对于局部变量,Kotlin 编译器不支持生成可修改的属性引用,只能生成只读的引用
funmain(){varcount=0valcountProperty=::countprintln(countProperty.get())countProperty.set(5)println(count)}
# 输出结果 Unresolved reference 'set'.
5、引用类
dataclassPerson(valname:String,valage:Int)valkClass:KClass<Person>=Person::classprintln(kClass.simpleName)