Kotlin的解构声明有什么意义?

时间:2017-12-25 15:38:39

标签: kotlin

为社区提出了一个问题。 我现在学习Kotlin,并且刚刚遇到了称为解构声明的概念 - 当你可以立即从函数返回多个值时。这似乎很方便,但同时它看起来像一个棘手的解决方法。每当我想到Java中的这个特性时,我都明白它是我体系结构中的一个漏洞 - 那么应该有一个类,而不仅仅是一些变量!你们觉得怎么样?

3 个答案:

答案 0 :(得分:6)

这个概念允许让类清楚地识别它们的一些主要属性,即组件

然后,您可以使用解构声明来访问这些组件,而不会出现访问属性的语法噪音。

比较

 val point = clickEvent.getPointOnScreen()
 val x = point.xCoordinate
 val y = point.yCoordinate
 // Use `x` and `y` in some calculations

并且,假设该类型包含component1component2,只需:

 val (x, y) = clickEvent.getPointOnScreen()

基本上,没有必要使用这种语法糖,并且概念本身不会损害任何抽象,它只提供了一种方便的方法来访问类实例的属性,在某些情况下你不这样做需要实例本身。

另一个例子是使用地图条目,例如:

for ((key, value) in myMap) { /* ... */ }

Map.Entry<K, V>解构后面仍有(key, value),你可以用for (entry in myMap) ...替换它,但通常它是你需要的两个属性。这就是解构可以让你免受一点语法噪音的影响。

答案 1 :(得分:0)

您还可以将componentN函数定义为非数据类的扩展,例如:

operator fun Location.component1() = latitude
operator fun Location.component2() = longitude

,当您要处理位置列表时,可以这样写:

for ((lat, lon) in locations) {
    ......
}

答案 2 :(得分:0)

在Kotlin中解构声明有什么意义?

结构化或构造是根据不同变量中的值创建对象。相反,从现有对象中将值提取到变量中的方法是相反的。

简洁是Kotlin哲学的一部分,因为代码越简单,越简洁,您就会越快地了解正在发生的事情。解构可以提高可读性,这是简洁的一部分。比较以下两个片段(让我们考虑类Triple

不使用解构

fun getFullName() = Triple("Thomas", "Alva", "Edison")
val result = getFullName()
val first = result.first
val middle = result.second
val last = result.third

使用解构

fun getFullName() = Triple("Thomas", "Alva", "Edison")
val (first, middle, last) = getFullName()

还可以利用解构的优势从Map's entries中提取keyvalue

for ((key, value) in aMap) {
    /* ... */
}