为社区提出了一个问题。 我现在学习Kotlin,并且刚刚遇到了称为解构声明的概念 - 当你可以立即从函数返回多个值时。这似乎很方便,但同时它看起来像一个棘手的解决方法。每当我想到Java中的这个特性时,我都明白它是我体系结构中的一个漏洞 - 那么应该有一个类,而不仅仅是一些变量!你们觉得怎么样?
答案 0 :(得分:6)
这个概念允许让类清楚地识别它们的一些主要属性,即组件。
然后,您可以使用解构声明来访问这些组件,而不会出现访问属性的语法噪音。
比较
val point = clickEvent.getPointOnScreen()
val x = point.xCoordinate
val y = point.yCoordinate
// Use `x` and `y` in some calculations
并且,假设该类型包含component1
和component2
,只需:
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中提取key
和value
。
for ((key, value) in aMap) {
/* ... */
}