使用 Kotlin 进行 Android 编程
by Pierre-Olivier Laurence, Amanda Hinchman-Dominguez, G. Blake Meike, Mike Dunn
第 2 章 Kotlin 集合框架 Kotlin 集合框架
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在上一章中,我们概述了 Kotlin 语言的语法。 对于任何语言来说,语法都是基础,但也仅此而已。 要完成实际工作,光靠语法是不够的。 要做到这一点,你需要表达式和惯用语,这些表达式和惯用语很容易组合成有用的代码,而且其他开发人员也很容易理解和修改。
几乎所有现代语言的一个重要方面都是其集合框架:将对象分组的方法以及操作对象的函数库。
Java 的集合框架在推出之初是最先进的。20 多年后的今天,较新语言提供的基本数据结构并没有太大变化。 我们熟悉的 Java 框架中的所有容器(甚至是最早版本的 C++stdlib )都还在:Iterable,Collection, List,Set, 和Map (使用它们的 Java 名称)。不过,为了响应对函数式编程风格的广泛接受,Swift 和 Scala 等现代语言的集合框架通常会提供一系列通用的高阶函数,用于对集合进行操作:filter 、map 、flatmap 、zip 等。您确实可以在 Kotlin 标准库的集合框架中找到这些函数。
在本章中,我们将首先访问集合本身以及 Kotlin 语言所支持的一些有趣扩展。之后,我们将深入探讨对集合进行操作的一些强大的高阶函数。
收藏基础知识
Kotlin 的集合框架嵌入了 Java 集合框架中的数据结构作为子集。 它用一些新功能包装了 Java 的基本类,并添加了对它们进行操作的功能转换。
让我们从快速了解数据结构本身的一些扩展开始,深入了解集合库。
Java 互操作性
由于与 Java 的无缝互操作性是 Kotlin 语言的核心目标,因此 Kotlin 的集合数据类型是基于其 Java 对应类型的。图 2-1说明了两者之间的关系。
图 2-1. Kotlin 集合类型层次结构及其与 Java 的关系。
通过将 Kotlin 集合类型作为 Java 类似类型的子类型,Kotlin 保留了 Java 集合框架的所有功能。在大多数情况下,Kotlin 扩展但不改变 Java 框架。 它只是添加了新的功能性方法。
有一个重要的例外:可变性。
可变性
一种在语法中包含可变性的语言,也会在其集合系统中包含可变性,这也许是合乎逻辑的。
Kotlin 在其集合框架中定义了两种不同的类型层次结构,一种用于可变集合,另一种用于不可变集合。从例 2-1 中可以看出这一点。
例 2-1. 可变列表和不可变列表
valmutableList=mutableListOf(1,2,4,5)valimmutableList=listOf(1,2,4,5)mutableList.add(4)// compiles// doesn't compile: ImmutableList has no `add` method.immutableList.add(2)
备注
可变与不可变正好相反。可变对象可以更改,不可变对象则不能更改。在优化代码时,这种区别至关重要。由于不可变对象不能改变,因此可以在多个线程之间安全地共享。然而,如果要共享可变对象,就必须明确地使其线程安全。线程安全需要锁定或复制,这可能会很昂贵。 ...