其他
Kotlin Vocabulary | 解构声明详解
有时候您会想要将一个包含了多个字段的对象分解,以初始化几个单独的变量。为了实现这点,您可以使用 Kotlin 的解构声明功能。继续阅读本文以了解解构的使用、Kotlin 默认提供的类型、如何在您自己的类和您无法控制但认为将会从解构中受益的类中实现解构,以及这一切的内部实现。
用法
解构声明允许我们使用以下方式定义本地值或变量:
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
fun play() {
val (name, breed) = goodDoggo
println("Best doggo: $name")
}
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
fun getBestDoggoAndOwner(): Pair<Doggo, Owner> { ...}
// 数据来自 Pair 时的用法
fun play() {
val (doggo, owner) = getBestDoggoAndOwner()
}
fun play(doggoOwner: Map<Doggo, Owner>) {
// 在集合和循环中使用解构
for( (doggo, owner) in doggoOwner){
...
}
}
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
data class Doggo(
val name: String,
val breed: String,
val rating: Int = 11
)
val (name, breed, rating) = goodDoggo
val (name, breed) = goodDoggo //不需要时可以忽略 rating 字段
val (name, rating) = goodDoggo
val (name, _, rating) = goodDoggo
内部原理
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
public final class Doggo {
@NotNull
private final String name;
@NotNull
private final String breed;
public Doggo(@NotNull String name, @NotNull String breed, int rating) {
...
}
...
@NotNull
public final String component1() {
return this.name;
}
@NotNull
public final String component2() {
return this.breed;
}
...
}
实现解构
/* Copyright 2020 Google LLC.
SPDX-License-Identifier: Apache-2.0 */
class Doggo(
val name: String,
val breed: String
) {
operator fun component1(): String = name
operator fun component2(): String = breed
...
}
为不属于您的类实现解构
Map.Entry
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/-entry/
总结
推荐阅读