ITmob-Ly
发布于 2024-07-26 / 103 阅读
0

Kotlin 中 :: 运算符详解

Kotlin-Blog

1. 介绍

本文深入介绍下 Kotlin 中的 :: 运算符,也称为可调用引用运算符,用于创建成员引用或类引用。可以让开发者用非常简洁的方式引用类、函数、属性和构造函数。

:: 操作符是创建指向成员或类的引用,而不直接调用它们。

2. :: 操作符创建引用的分类和用法

2.1 类引用

获取 Kotlin 类的引用,该引用是一个 KClass 类型值

val c = MyClass::class

Kotlin 类引用与 Java 类引用不同。要获取 Java 类引用,请使用 KClass 实例上的 .java 属性。

val jc = MyClass::class.java

2.2 可调用引用

对函数、属性和构造函数的引用也可以被调用或作为函数类型的实例。

所有可调用引用的公共超类型是 KCallable,其中 R 是返回值类型。对于属性来说它是属性类型,对于构造函数来说它是构造类型。

2.2.1 函数引用

函数引用属于 KFunction 类型,它是 KCallable 类型的子类

声明函数时,可以直接调用它(isOdd(5)):

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

也可以使用 :: 运算符将函数用作函数类型的值,将其传递给另一个函数。

val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd))

也可以通过引用运算符创建引用类型的值,需要时再调用

fun greeting(name: String) {
    println("Hello, $name!")
}

val websiteGreeting = ::greeting

fun main() {
    websiteGreeting("https://itmob.cn")
}

2.2.2 属性引用

可调用引用也适用于属性。

val x = 1

fun main() {
    println(::x.get())
    println(::x.name)
}

::x 返回结果为 KProperty 类型的属性对象。您可以使用 get() 读取其值或使用 name 属性获取属性名称。

2.2.3 构造函数引用

可调用引用也适用于构造函数。构造函数可以像方法和属性一样被引用。只要程序需要一个函数类型对象,该对象采用与构造函数相同的参数并返回适当类型的对象,您就可以使用它们。

使用 :: 运算符并添加类名来引用构造函数:

class Foo

fun function(factory: () -> Foo) {
    val x: Foo = factory()
}

fun main() {
    function(::Foo)
}

3. 在高阶函数中使用可调用引用

当与高阶函数(将其他函数作为参数或返回值的函数)一起使用时,可调用引用让函数调用更加方便。

fun greeting() {
    println("Hello, https://itmob.cn")
}

fun doSomething(action: () -> Unit) {
    action()
    // TODO do something else
}

fun main() {
    doSomething(::greeting)
}