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)
相关推荐
Highcharts.js7 小时前
倒置百分比堆叠面积图表示列详解|Highcharts大气成分图表代码
开发语言·信息可视化·highcharts·图表开发·面积图·图表示例·推叠图
csdn_aspnet7 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
Dicky-_-zhang7 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨7 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
存在morning7 小时前
【GO语言开发实践】二 GO 并发快速上手
大数据·开发语言·golang
fake_ss1987 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
茉莉玫瑰花茶8 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁8 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
No8g攻城狮8 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
xiaoerbuyu12339 小时前
开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件
java·开发语言