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)
相关推荐
caimouse1 小时前
reactos编码规范
c语言·开发语言
xieliyu.5 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
明夜之约6 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee6 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Jinkxs6 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
辣机小司6 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
数智工坊6 小时前
机器人运动控制:采样、优化与学习三大流派深度对比与实战
android·学习·机器人
CryptoPP6 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫6 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
fangdengfu1237 小时前
ES分析系统各个服务日志占用量
java·前端·elasticsearch