Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Kotlin
Code

Kotlin从零开始:范围和集合

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Kotlin From Scratch.
Kotlin From Scratch: Nullability, Loops, and Conditions
Kotlin From Scratch: Packages and Basic Functions

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

Kotlin  是一种编译为Java字节码的现代编程语言。它是免费和  开源的,并承诺为Android编码更有趣。

在本系列的前一篇文章中,您了解了Kotlin中的可空性,循环和条件。在本教程中,我们将继续通过查看Kotlin中的范围和集合API来学习该语言。

1.范围

Kotlin中的范围是定义起始值和结束值的唯一类型。换句话说,它是开始和结束值之间的间隔。Kotlin中的范围已关闭,这意味着起始值和结束值都包含在范围内。

现在我们来看看在Kotlin中创建范围的不同方式。 

该.. 运营商

在上面的代码中,我们创建了一个封闭的范围。该变量oneToFive将包含以下值:1,2,3,4,5。我们可以使用for循环结构对其进行循环。

上面的代码可以缩短为:

我们还可以创建一系列字符:

变量aToZ将包含英文字母表中的所有字母。

该rangeTo()功能

的..操作者可与被替换rangeTo() 扩展函数来创建一个范围。例如,我们也可以这样做1.rangeTo(5),它仍然会和使用.. 前面讨论的操作符一样的结果  。 

该downTo()功能

这是另一个扩展函数,它将创建一个从给定数字开始到另一个数字的范围.

我们可以使用该step()功能修改范围  。这将修改范围内每个元素之间的增量。

上面的代码将包含1到10之间的奇数。 

该in运营商

的in运算符用于确定一个值是否存在于给定范围内。

在上面的代码中,我们使用in运算符来检查5是否在1..10范围内。我们也可以通过使用  !n来检查5是否不在范围内。

2.收藏

集合用于将相关对象的组存储在内存中。 在集合中,我们可以检索,存储或组织对象。Kotlin将其集合API作为 构建在Java Collections API之上的标准库提供  。(我们将在未来的帖子中讨论Kotlin中的接口。) 

您应该注意,这些接口在编译时与其实现相关联。你不能看到科特林执行源代码,因为藏品实际上是由标准的Java集合实现,例如ArrayList,  Maps,  HashMap,  Sets,  HashSet,  List等。 要真正理解Kotlin中的集合API,您需要熟悉Java中的这些基本类和接口。

在本节中,我们将了解List,Set并Map在科特林集合。(如果您想在Kotlin上进行数组复习,请参阅本系列的  第一篇教程。)

Kotlin的集合使我们能够通过一小段代码实现很多功能,这与Java不同,它似乎需要大量代码才能实现一点!Kotlin有两个集合变体:可变和不可变的。 可变集合为我们提供了通过添加,删除或替换元素来修改集合的功能。不可变集合不能被修改,并且没有这些辅助方法。 

请注意,通过运算符函数(我们很快就可以实现)添加,删除或替换不可变集合中的元素,但这些将最终创建一个新集合。 

该Iterable接口

Kotlin Iterable接口位于集合类层次结构的顶部。该接口使得集合可以表示为一系列元素(可以自然地迭代)。 

该Collection 接口

Kotlin Collection接口扩展了  Iterable接口。该Collection接口是不可改变的。换句话说,您拥有对集合的只读访问权限。该Set和  List接口(更多关于这些不久)在科特林扩展这个接口。 

Collection 界面中的一些功能和属性  是:

  • size:这个属性返回集合的大小。
  • isEmpty():如果集合为空则返回true,否则返回false。 
  • contains(element: E):如果参数中指定的元素存在于集合中,则返回true。
  • containsAll(element: Collection):如果作为参数传递的集合中的元素存在于集合中,则返回true。  

该MutableIterable接口

Kotlin中的这个接口为我们提供了一个来自父Iterable 接口的专门的可变迭代器  。

该MutableCollection接口

将MutableCollection在科特林接口是一个专门的界面,使藏品是可变的。换句话说,添加和删除操作可以在给定的集合上执行。 该接口扩展了上面已经讨论过的Collection接口和MutableIterable接口。 该MutableSet和  MutableList 在科特林接口(我们会得到他们不久)扩展这个接口。该界面中可用的功能(除了其父项中提供的功能)是:

  • add(element: E):将作为参数传递的元素添加到集合中,如果集合不支持重复且元素已存在,则成功或返回true则返回true。 
  • remove(element: E):从集合中删除作为参数传递的元素。如果成功或错误返回true,如果它不存在于集合中。
  • addAll(elements: Collection):将作为参数传递的集合中的所有元素添加到集合中。如果没有添加任何内容,则返回true或false。
  • removeAll(elements: Collection):删除作为参数传递的集合中的所有元素。如果没有被删除,则返回true,否则返回false。
  • retainAll(elements: Collection):仅保留作为参数传递的集合中存在的元素。如果成功或失败,则返回true,如果没有保留。  
  • clear():删除此集合中的所有元素。

现在,您已经了解了Kotlin集合类层次结构中的顶级接口,现在让我们来看看Kotlin如何处理教程剩余部分中的集合,如列表,集合和映射。 

清单

列表是元素的有序集合。这是一个广泛使用的流行集合。让我们看看在Kotlin中创建列表的不同方式。

使用  listOf()函数在Kotlin中,我们可以使用listOf()Kotlin标准库中的辅助函数创建一个不可变(只读)列表  。这个函数返回一个Kotlin List 接口类型。

在Kotlin中,我们可以使用listOf()Kotlin标准库中的辅助函数创建一个不可变(只读)列表  。这个函数返回一个Kotlin List 接口类型。

运行上面的代码将打印: 

此外,我们可以将不同类型的值传递给  listOf() 参数,并且结果仍然有效 - 它将是混合类型的列表。 

使用  emptyList()函数

这个函数只是创建一个空的不可变列表并返回一个Kotlin List接口类型。

使用  listOfNotNull()函数

在  List 从科特林标准库接口扩展只有  Collection 接口。换句话说,它的唯一父母就是Collection界面。它覆盖父界面中的所有功能以满足其特殊需求,并定义其自身的功能,例如:

. 在  List 从科特林标准库接口扩展只有  Collection 接口。换句话说,它的唯一父母就是Collection界面。它覆盖父界面中的所有功能以满足其特殊需求,并定义其自身的功能,例如: 它覆盖父界面中的所有功能以满足其特殊需求,并定义其自身的功能,例如:

  • get(index: Int):一个函数运算符,它返回指定索引处的元素。
  •  indexOf(element: E):返回在列表中作为参数传递的第一个元素的索引,如果没有找到,则返回-1。 
  • lastIndexOf(element: E):返回列表中作为参数传递的元素的最后一次出现的索引,如果没有找到,则返回-1。
  •  listIterator():返回列表中元素的列表迭代器。
  • subList(fromIndex: Int, toIndex: Int):返回一个包含指定开始和结束索引之间列表部分的列表。 

使用  arrayListOf()函数

这将创建一个可变列表并返回一个Java ArrayList类型。

使用  mutableListOf()函数

要添加,删除或替换列表中的值,我们需要使列表成为可变列表。我们可以通过调用toMutableList()列表中的函数将不可变列表转换为可变列表。但是请注意,此方法将创建一个新列表。

要从头开始创建某种特定类型的可变列表,例如  String我们使用mutableListOf(),而对于混合类型,我们可以直接使用该  mutableListOf()函数。

任何这些函数都将返回一个MutableListKotlin接口类型。该接口扩展了本节前面讨论的接口MutableCollection 和List接口。  该MutableList界面根据其位置添加了检索或替换项目的方法:

  • set(index: Int, element: E):用另一个元素替换列表中的一个元素。这将返回之前在指定位置的元素。
  • add(index: Int, element: E):在指定的索引处插入一个元素。 
  • removeAt(index: Int):摆脱特定索引处的元素。 

运行上面的代码,我们产生以下结果:

请注意,所有这些函数都ArrayList在幕后创建了一个Java 。


一个集合是独特元素的无序集合。换句话说,它不能有任何重复! 让我们来看看在Kotlin中创建一个集合的一些不同方法。其中每个都创建了不同的数据结构,每个数据结构都针对某种类型的任务进行了优化。 

使用  setOf() 函数

要在Kotlin中创建一个不可变(只读)集合,我们可以使用该函数  setOf()返回一个Kotlin Set 接口类型。 

请注意,Kotlin Set 接口仅扩展Kotlin Collection 接口并覆盖其父级中可用的所有属性。

使用  hashSetOf()函数 

使用该hashSetOf() 函数将创建一个Java HashSet集合,它将元素存储在散列表中。因为此函数返回Java HashSet类型,所以我们可以添加,删除或清除集合中的元素。换句话说,它是可变的。 

使用  sortedSetOf() 函数

使用该  sortedSetOf() 函数可以TreeSet在幕后创建一个Java 集合,该集合根据其自然顺序或比较器对元素进行排序。这个集合也是可变的。

使用  linkedSetOf()函数

这个函数返回一个Java LinkedHashSet类型。这个可变集以它们插入的顺序维护了集合中条目的链接列表。 

mutableSetOf

我们可以使用  mutableSetOf() 创建一个可变集。这个函数返回一个Kotlin MutableSet接口类型。在幕后,这个功能只是创建一个Java LinkedHashSet。  

该MutableSet接口扩展MutableCollection了Set 接口和接口。 

地图

将键关联到值。密钥必须是唯一的,但相关的值不需要。 这样,每个键都可以用来唯一标识关联的值,因为映射可以确保集合中不能有重复的键。在幕后,Kotlin使用Java  Map集合来实现其地图集合类型。

使用  mapOf() 函数

要Map在Kotlin中创建不可变或只读  集合,我们使用该  mapOf()函数。 我们用这个函数创建一个映射,给它一个成对的列表 - 第一个值是关键字,第二个是值。调用这个函数返回一个Kotlin Map接口类型。

运行上面的代码将产生结果: 

不同的是  List ,并  Set 在科特林扩展接口  Collection 接口方面,  Map 接口不扩展任何可言。该界面中的一些属性和功能是:

  • size:这个属性返回地图集合的大小。
  • isEmpty():如果地图为空则返回true,否则返回false。
  • containsKey(key: K):如果映射包含参数中的键,则返回true。 
  • containsValue(value: V):如果映射将一个或多个键映射为作为参数传递的值,则返回true。
  • get(key: K):返回与给定键匹配的值,如果没有找到,则返回'null'。 
  • keys:该属性返回Set 映射中所有键的不可变  。
  • values:返回Collection 地图中所有值的不可变  。

使用  mutableMapOf()函数

该mutableMapOf()函数为我们创建一个可变映射,以便我们可以添加和删除映射中的元素。这将返回一个Kotlin MutableMap接口类型。

该  MutableMap 接口不扩展  MutableCollection 接口; 它只是父  Map 接口。 它覆盖  keys,  entries 并  values 以重新定义它们从父接口属性。以下是MutableMap 界面中提供的一些额外功能  :

  • put(key: K, value: V):将键值对插入到地图中。这将返回与键关联的先前值,如果之前没有使用该键,则返回null。 
  • remove(key: K):从地图中删除密钥及其链接的值。 
  • putAll(from: Map):使用给定地图中的所有数据更新地图。新键将被添加,并且现有键将被更新为新值。 
  • clear():从地图中删除所有元素。 

我们可以使用该get() 函数获取键的值  。我们也可以使用方括号表示法作为快捷方式get()。 

使用  hashMapOf()函数

使用这个函数返回一个HashMap可变的Java 类型。本HashMap类使用哈希表来实现Java Map接口。  

使用  linkedHashMap()函数

这个函数返回一个LinkedHashMap可变的Java 类型。在LinkedHashMap类扩展的Java HashMap,并保持在它们被插入的顺序映射条目的链接列表。 

使用  sortedMapOf()函数

这个函数返回一个SortedMap可变的Java 类型。Java SortedMap类看到地图中的条目按照升序键维护。

请记住,在Kotlin中实现这些集合接口发生在编译时。

集合操作函数

Kotlin为我们提供了许多有用的操作符函数,称为扩展函数,可以在集合上调用它们。让我们来看看最有用的一些。

该last()功能

此运算符函数返回集合中的最后一个元素,如列表或集合。我们还可以提供一个谓词来在元素的子集内进行搜索。

该  first() 功能

此运算符函数在列表或集合等集合上调用时返回第一个元素。如果给出谓词,则它使用谓词将操作限制为元素的子集。

该max() 功能

在集合(如列表或集合)上调用此运算符函数将返回最大元素,如果未找到最大元素,则返回null。

该drop()功能

调用此运算符函数将返回一个新的列表或集合,其中包含除前n个元素之外的所有元素。 

该plus()功能

该运算符函数返回一个集合,其中包含原始元素的所有元素,如果该元素尚不在集合中,则返回给定元素。这将最终创建一个新的列表,而不是修改列表。

该minus()功能

plus()功能的反面是minus()功能。它返回一个集合,其中包含除给定元素之外的原始集合的所有元素。这也最终创建一个新的列表,而不是改变列表。

该average()功能

调用此运算符函数将返回集合中平均数量的元素。

Kotlin收藏标准库中大多数扩展功能都可用。建议您查阅文档以了解其他文档。

结论

在本教程中,您了解了Kotlin编程语言中的范围和集合API。在Kotlin From Scratch系列的下一篇教程中,您将介绍Kotlin的功能。再见!

要了解有关Kotlin语言的更多信息,我建议访问Kotlin文档。或者在Envato Tuts上查看我们的其他一些Android应用程序开发帖子!

Envato qr branded
关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.