Kotlin Maps:五个基本函数

简介: Kotlin Maps:五个基本函数映射,也称为关联数组,是任何编程语言中的核心数据类型。列表和映射可能是最常见的数据类型。因此,熟悉它们是学习一门新语言的必要步骤。

Kotlin Maps:五个基本函数

image.png


映射,也称为关联数组,是任何编程语言中的核心数据类型。列表和映射可能是最常见的数据类型。因此,熟悉它们是学习一门新语言的必要步骤。


Kotlin 对开箱即用的 maps 提供全面支持。首先,您可以在本地使用 Java 的集合框架,这是业内最知名且久经考验的框架之一。此外,Kotlin 添加了一些额外的功能,使 maps 使用起来更加方便。


在这篇文章中,我谈论的是 maps 的基础知识。我将向您展示处理 maps 时最常用的函数。

Kotlin 中 maps 的用途

在使用 maps 之前了解什么是 maps。本质上,映射是键值对的集合。关键是标识符。您可以使用它来查找集合中的特定元素。该值是您要存储的数据,它与一个键相关联。


image.png


数据类型的实现是数据结构。maps 的主要实现有两种:


  • 哈希表:它使用哈希函数来计算每个键的索引。这些对基于该索引进入一个桶数组。只要散列函数均匀分配密钥,性能就是线性的。
  • 搜索树:它使用树结构来存储键。性能不如哈希表。但是,它会根据键的自然顺序对键进行排序。


通常,除非您需要按顺序迭代键,否则您将使用哈希表。


对于本文,实现不相关,因为接口没有改变。但是,您应该知道大多数默认构造函数都会创建哈希表(例如 Java 中的LinkedHashMap)。

支持 Kotlin Maps 的不变性

有趣的是,Kotlin 中 maps 的标准接口是不可变的。这意味着什么?一旦初始化 maps 实例,就不能再更改它。减少对象的可变性是最佳实践。例如,开创性的《Effective Java》 一书就推荐了它。这是为什么?不可变对象更容易推理。他们不太容易出现意外错误。您应该尽可能多地使用不可变对象。


话虽如此,有时您确实必须构建可变对象。在 Kotlin 中有第二个接口MutableMap,它提供写操作。每当您需要修改 maps 内容时,请使用此方法。完成后,最好将其转换为不可变映射以防止进一步修改。


由于 Kotlin 的简洁语法,初始化一个新 maps 就像执行以下操作一样简单:


val numbers: MutableMap<String, Int> = mutableMapOf(
    "one" to 1,
    "two" to 2,
    "three" to 3,
    "four" to 4,
    "five" to 5
)


现在你有了一个 maps 实例。让我们来谈谈访问和操作里面的数据需要知道的最相关的方法。

Get

该**GET**方法查找对应于给定键的映射中的值。


它接收一个参数,这是您要查找的键。它返回与该键关联的值。如果映射中不存在键,则返回 null。Kotlin 鼓励空安全。这就是为什么返回类型被清楚地标记为可空类型的原因。它强制您处理该值可能为空的事实以防止运行时异常。


image.png


让我们访问我们刚刚定义的映射中的一个值:


val value = numbers["three"]
println("value is $value") // will print "value is 3"



等等,那里发生了什么?没有调用 get 方法。它看起来就像访问一个数组!好吧,它看起来不像,但我们正在调用*get*方法。我们正在使用 Kotlin 的内置运算符重载,它会自动将类似数组的访问转换为使用 get 方法。当您阅读它时,它使语法更轻巧且更易于处理。它看起来像Ruby,具有静态类型的显着优势。

Put

**Put**的方法有两个目的:


  • 它向映射中插入一个新键,并为其绑定一个提供的值。
  • 它将与现有键关联的值替换为新的值。


我们对两者使用相同的方法。该方法接收一个键和一个值。如果映射中不存在键,则将其与值一起插入。如果它已存在于 maps 中,则键保持不变,新值替换旧值。


对于插入,该方法返回 null。对于替换,它返回旧值。


让我们看一个例子:


numbers.put("six", 6) // numbers["six"] will return 6



如果您不需要旧键的值,您可以使用索引语法,就像使用 get 一样


numbers["six"] = 6 // numbers["six"] will return 6


Remove

该**Remove**方法从 maps 删除一个键和及其相关联的值。


它接收密钥作为参数。它返回值,如果键在 maps 中不存在,则该值为 null。


numbers.remove("three") // numbers["three"] will return null



如果您想无条件删除密钥,请使用上一个调用。但是,这种方法有一个变体。相反,您可以同时提供键和值。在这种情况下,只有当键存在且值与您提供的值匹配时,映射才会删除该对。


numbers.remove("three", 2) // Won't remove the pair
numbers.remove("three", 3) // Will remove the pair

复制代码


这三种方法包括插入、替换、访问和删除元素。这是您在代码中使用 maps 所需的最低限度。但是,这些接口的 API 比这更广泛。还有更多的方法可以以您可以想象的任何方式与 maps 进行交互。我将提到另外两种您经常使用的方法。

Clear

该**Clear** 方法删除 maps 中的所有项目。


它不接收或返回任何参数。它清空 maps,将 maps 的大小设置回零。使用此操作后,您将无法访问之前存在的任何键或值。


numbers.clear() // numbers.size will be 0



从本质上讲,这类似于创建新 maps 并从头开始。

Iterator

该**Iterator** 方法是有来遍历 map 的内容。


具体来说,它返回一个迭代器对象。从某种意义上说,您使用迭代器将 maps 转换为列表。您可以使用此对象遍历映射中的每个(键、值)对:


val iterator = numbers.iterator()
while (iterator.hasNext()) {
    val (key, value) = iterator.next()
    println("$key -> $value") // prints each pair like this "one -> 1"
}


不过,您很少会在实际代码中看到这种语法。Iterator 是另一个在 Kotlin 中具有替代语法的运算符,它使代码更加简洁明了:


for ((key, value) in numbers) {
    println("$key -> $value") // prints each pair like this "one -> 1"
}



这个块和以前一样,但它的可读性明显更高。如您所见,可读性是 Kotlin 的一个重要因素。


迭代器是一个基本的构建块。最重要的是,还有很多其他方法可以查看 maps 并按照您想要的方式对其进行操作。一些示例是方便的方法,例如 forEachmap filter

maps 是核心抽象

关于 maps 还有很多要说的。请务必查看 API 参考,因为这里有比我向您展示的方法更多的方法。如果您需要以不同的方式与 maps 进行交互,很可能存在适合您需求的操作。


maps 无处不在。你会经常使用它们。幸运的是,Kotlin 为您提供了保障。基础 maps 类方便、易于使用,并且涵盖了大量用例。它经过彻底测试和高度优化。当您可以重用其功能时,不要尝试重新发明轮子。


最后我,目前是华为云享专家,51CTO 博客首席体验官,专注于大前端技术的分享,包括 Flutter,小程序,安卓,VUE,JavaScript。大家可以公众号搜索“坚果前端”

相关文章
|
21天前
|
Kotlin
Kotlin - 标准函数(with、run和apply)
Kotlin - 标准函数(with、run和apply)
7 1
|
10月前
|
API Kotlin
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
82 0
|
10月前
|
安全 Java Kotlin
Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解
Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解
94 0
|
10月前
|
Java 编译器 Kotlin
Kotlin 中变量,类型,表达式,函数详解
Kotlin 中变量,类型,表达式,函数详解
70 0
|
Java Kotlin
Kotlin data数据类、copy()函数、sealed密封类
Kotlin data数据类、copy()函数、sealed密封类使用
125 0
|
8月前
|
存储 Java 编译器
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
35 0
|
8月前
|
Java Android开发 开发者
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
57 0
|
10月前
|
安全 Java 编译器
Kotlin 学习笔记(一)—— 基本类型、函数、lambda、类与对象的写法
Kotlin 作为 Android 开发的首选语言,其基础语法和特性需要重点学习。本文概括总结了 Kotlin 的基本类型、关键字、函数、闭包、高阶函数、类与对象等核心知识点,并给出示例代码进行讲解。
157 0
Kotlin 学习笔记(一)—— 基本类型、函数、lambda、类与对象的写法
|
10月前
|
Java Kotlin
Kotlin中与Java互操作与可空性、类型映射、属性访问、@JvmOverloads、@JvmField、@JvmStatic、@Throws和函数类型操作详解
Kotlin中与Java互操作与可空性、类型映射、属性访问、@JvmOverloads、@JvmField、@JvmStatic、@Throws和函数类型操作详解
71 0
|
10月前
|
Kotlin
Kotlin中标准库函数(apply、let、run、with、also、takeIf、takeUnless)的使用详解
Kotlin中标准库函数(apply、let、run、with、also、takeIf、takeUnless)的使用详解
60 0