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 字段
解构不允许您选择使用某个确切的字段;它永远使用前 x 个字段,这里的 x 是您所声明的变量数。这样做的缺点是很容易造成错误,比如下面这段代码便可能造成意外的结果:
val (name, rating) = goodDoggo
rating 值事实上会持有 goodDoggo.breed 的值。您将会看到一个警告: “Variable name ‘rating’ matches the name of a different component” (‘rating’ 变量名匹配了名字不同的 component) 并且建议您将 rating 重命名为 breed。由于这个警告只存在于 IDE 中,而且不是编译器警告,您很容易就会注意不到它:
使用错误的解构变量声明
如果您只需要一部分不连续的字段,可以使用 _ 代替那些您不感兴趣的字段,Kotlin 将会跳过它们。这样一来示例就会变成下面这样:
val (name, _, rating) = goodDoggo
内部原理
让我们通过反编译后的数据类代码来看看究竟发生了什么。本文将会只专注于那些为解构生成的函数,如果需要了解更多关于数据类的信息,请期待我们未来的文章。
想要查看反编译后的 Java 代码,您可以在 Android studio 中使用 Tools -> Kotlin -> Show Kotlin Bytecode 然后点击 Decompile 按钮。
/* 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;
}
…
}
我们看到编译器为主构造函数中声明的每个属性都生成了一个名为 componentN 的函数,这里的 N 是字段在主构造函数中的索引。
实现解构
正如我们前面所看到的,解构的实现有赖于 componentN 函数。所以如果您想要为一个不支持解构的类添加解构功能,只需要实现对应的 componentN operator 函数即可。请确保您的函数使用了 operator 前缀。
/* 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
…
}
为不属于您的类实现解构
Kotlin 允许您通过扩展函数为不属于您的类实现解构。举个例子,Map.Entry 是一个接口并且不支持解构。为了方便使用,Kotlin 为其创建了 component1() 和 component2() 函数,分别返回 Map.Entry 的键和值。
总结
当您需要将一个对象的字段拆解为值或者变量时,可以使用解构功能。它在内部是通过提供一系列的 componentN operator 函数实现的,所以当您认为可以通过此功能受益时,可以自己为您的类提供这些函数,便可以实现解构功能。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/596e5d2ba57dc9b0552d2f668f32a335.jpeg)
结语
- 现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。
- 音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。
- 要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且
- OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
2787)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!