Kotlin 开发 - 双冒号操作符(引用顶层函数、引用成员函数、引用构造函数、引用属性、引用类)

双冒号操作符

1、引用顶层函数
  • 直接引用 ::【函数名】
kotlin 复制代码
fun isOdd(x: Int) = x % 2 != 0

val numbers = listOf(1, 2, 3)

val oddNumbers = numbers.filter(::isOdd)

println(oddNumbers)
kotlin 复制代码
// 等价于

fun isOdd(x: Int) = x % 2 != 0

val numbers = listOf(1, 2, 3)

val oddNumbers = numbers.filter { isOdd(it) }

println(oddNumbers)
2、引用成员函数
  1. 未绑定引用 【类名】::【成员函数】
kotlin 复制代码
val list = listOf("a", "bb", "ccc")

val lengths = list.map(String::length)

println(lengths)
kotlin 复制代码
// 等价于

val list = listOf("a", "bb", "ccc")

val lengths = list.map { it.length }

println(lengths)
kotlin 复制代码
data class Person(val name: String, val age: Int)

val list = listOf(Person("Alice", 25), Person("Bob", 30))

val names = list.map(Person::name)

println(names)
kotlin 复制代码
// 等价于

data class Person(val name: String, val age: Int)

val list = listOf(Person("Alice", 25), Person("Bob", 30))

val names = list.map { it.name }

println(names)
  1. 已绑定引用 【对象实例】::【成员函数】
kotlin 复制代码
data class Person(val name: String, val age: Int)

val p = Person("Alice", 25)

val nameGetter = p::name

println(nameGetter())
3、引用构造函数
kotlin 复制代码
data class Person(val name: String, val age: Int)

val createPerson = ::Person

val p = createPerson("Alice", 25)

println(p)
4、引用属性
kotlin 复制代码
var count = 0

fun main() {
    val countProperty = ::count

    println(countProperty.get())

    countProperty.set(5)

    println(count)
}
  • 对于局部变量,Kotlin 编译器不支持生成可修改的属性引用,只能生成只读的引用
kotlin 复制代码
fun main() {
    var count = 0

    val countProperty = ::count

    println(countProperty.get())

    countProperty.set(5)

    println(count)
}
复制代码
# 输出结果

Unresolved reference 'set'.
5、引用类
kotlin 复制代码
data class Person(val name: String, val age: Int)

val kClass: KClass<Person> = Person::class

println(kClass.simpleName)
相关推荐
我命由我123451 小时前
Kotlin 开发 - sealed 关键字
android·java-ee·kotlin·android studio·android jetpack·android-studio·android runtime
Jacky-0081 小时前
Python pywin32 outlook邮箱
开发语言·python·outlook
minji...1 小时前
Linux 线程同步与互斥(六) 线程安全与重入问题,死锁,线程done
linux·运维·开发语言·数据库·c++·算法·安全
佳xuan1 小时前
QA与RAG检索
java·服务器·前端
2401_873479401 小时前
遭遇DDoS攻击后如何快速分析攻击源?用IP查询+离线库定位异常IP
服务器·开发语言·tcp/ip·php
Digitally3 小时前
5 种简单方法:如何将华为手机照片传输到 Mac 电脑
android
半瓶榴莲奶^_^4 小时前
jvm java虚拟机
java·jvm
Gofarlic_oms19 小时前
利用API实现ANSYS许可证管理自动化集成
运维·服务器·开发语言·matlab·自动化·负载均衡
AI+程序员在路上10 小时前
VS Code 完全使用指南:下载、安装、核心功能与 内置AI 编程助手实战
开发语言·人工智能·windows·开源