热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

在Kotlin开发中如何使用集合详解

这篇文章主要给大家介绍了关于在Kotlin开发中如何使用集合的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

关于 Kotlin 开发

使用 Kotlin 开发 Android App 在 Java 工程师群体中变得越来越流行。如果你由于某些原因错过了 Kotlin,我们强烈建议你看一下这篇文章。

对于那些处在技术前沿和喜欢 Kotlin 的开发者来说,本篇文章和他们息息相关。所以,下面就让我们来看一下怎样在 Kotlin 中使用集合吧。

Kotlin中的集合是基于 Java 集合的框架。本篇文章主要讲的是 kotlin.collections 包中的几个特性。

数据处理

Kotlin 中有一个拓展函数的特性,这个特性可以使 Kotlin 标准库(stdlib)支持 JDK 的中的类的方法。举个例子:如果你打开Kotlin 标准库中的 open_Collection.kt 文件,你可以找到很类似于下面这样的方法:

/**
* Returns a list containing only elements matching the given [predicate].
*/
public inline fun  Iterable.filter(predicate: (T) -> Boolean): List {
 return filterTo(ArrayList(), predicate)
}

所以,你写的代码可能是下面这个样子:

val originalList = listOf(1, 2, 3, 4, 5, 6)
assertEquals(listOf(2, 4, 6), originalList.filter { it % 2 == 0 })
val originalList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = originalList.firstOrNull { it > 4 }
assertEquals(result, 5)
val originalList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = originalList.getOrElse(12) { 12 }
assertEquals(result, 12)
val originalList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = originalList.dropWhile { it <5 }
assertEquals(result, listOf(5, 6, 7, 8, 9, 10))
val originalList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val result = originalList
    .dropWhile { it <5 }
    .find { it <7 }
assertEquals(result, 5)

你需要注意的是:filter和dropWhile 就像其他操作符一样,返回的是一个新的事例。这意味着 originalList 不会改变。

为了更好的理解代码底层到底发生了什么,我们打开源码看一下 listOf() 方法:

/** Returns a new read-only list of given elements. The returned list is serializable (JVM). */
public fun  listOf(vararg elements: T): List = if (elements.size > 0) elements.asList() else emptyList()

由于RxJava和 Java 8 的 Stream API 包含类似的方法,所以上面的代码和 RxJava 以及 Stream API很像。 但是由于 Android 工程师不能使用 Stream API,所以他们更多的使用的 RxJava 处理数据的方法来解决这个问题。然后,这种操作并不完全正确,原因在于:RxJava 是一个事件处理库,而不是数据处理。所以你现在可以使用 Kotlin 来解决这个问题而不必担心这些问题。

不可变集合

如果你对不可变对象(immutable object)感觉到很陌生的话,我们建议你先看完这个文档 看完后,在看一下这个。

Kotlin区分可变对象(mutable object)和不可变对象(lists, sets, maps等等)的方法和其他编程语言不一样。在使用Kotlin集合时准确区分这几种两种对象对于避免不必要的错误和 bug 都非常有用。

Kotlin允许像 Java 类似的写法创建 Kotlin 的集合实例。

val list = ArrayList()

这是最简单和整洁的方法. 下面这种方法是最棒的写法:

val list: kotlin.collections.List = java.util.ArrayList()

我创建了一个kotlin.collections.List引用,同时我们也创建了一个不可变的集合。如果你不是很相信的话,那么我们可以看一下源码:

public interface List : Collection {
 // Query Operations
 override val size: Int
 override fun isEmpty(): Boolean
 override fun contains(element: @UnsafeVariance E): Boolean
 override fun iterator(): Iterator

 // Bulk Operations
 override fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean

 // Positional Access Operations
 /**
 * Returns the element at the specified index in the list.
 */
 public operator fun get(index: Int): E

 // Search Operations
 /**
 * Returns the index of the first occurrence of the specified element in the list, or -1 if the specified
 * element is not contained in the list.
 */
 public fun indexOf(element: @UnsafeVariance E): Int

 /**
 * Returns the index of the last occurrence of the specified element in the list, or -1 if the specified
 * element is not contained in the list.
 */
 public fun lastIndexOf(element: @UnsafeVariance E): Int

 // List Iterators
 /**
 * Returns a list iterator over the elements in this list (in proper sequence).
 */
 public fun listIterator(): ListIterator

 /**
 * Returns a list iterator over the elements in this list (in proper sequence), starting at the specified [index].
 */
 public fun listIterator(index: Int): ListIterator

 // View
 /**
 * Returns a view of the portion of this list between the specified [fromIndex] (inclusive) and [toIndex] (exclusive).
 * The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, and vice-versa.
 */
 public fun subList(fromIndex: Int, toIndex: Int): List
}

你看到源码中没 add() 方法,也没有 remove() 方法,同时也没有其他的一些方法去改变这个集合。在这个例子中,实例本身是java.util.ArrayList。 下面我们来通过一个例子来解释为什么:

val list: kotlin.collections.MutableList = java.util.ArrayList()
list.add("string")

你最好在本地的源码中看这例子:

public interface MutableList : List, MutableCollection {
 // Modification Operations
 override fun add(element: E): Boolean
 override fun remove(element: E): Boolean

 // Bulk Modification Operations
 override fun addAll(elements: Collection): Boolean

 /**
 * Inserts all of the elements in the specified collection [elements] into this list at the specified [index].
 *
 * @return `true` if the list was changed as the result of the operation.
 */
 public fun addAll(index: Int, elements: Collection): Boolean
 override fun removeAll(elements: Collection): Boolean
 override fun retainAll(elements: Collection): Boolean
 override fun clear(): Unit

 // Positional Access Operations
 /**
 * Replaces the element at the specified position in this list with the specified element.
 *
 * @return the element previously at the specified position.
 */
 public operator fun set(index: Int, element: E): E

 /**
 * Inserts an element into the list at the specified [index].
 */
 public fun add(index: Int, element: E): Unit

 /**
 * Removes an element at the specified [index] from the list.
 *
 * @return the element that has been removed.
 */
 public fun removeAt(index: Int): E

 // List Iterators
 override fun listIterator(): MutableListIterator
 override fun listIterator(index: Int): MutableListIterator

 // View
 override fun subList(fromIndex: Int, toIndex: Int): MutableList
}

怎样理解:Java 的 ArrayList 是否和 Kotlin 的 List一样?

val list: kotlin.collections.List = java.util.ArrayList()

实际上,这里并没有什么奇怪的地方. Kotlin 的集合继承了 Java 的 List 的接口。我们可以从 kotlin.collections.Collection.kt 文件中看到:

@file:kotlin.jvm.JvmMultifileClass
@file:kotlin.jvm.JvmName("CollectionsKt")
package kotlin.collections
import kotlin.comparisons.compareValues

正如之前所提的,这个文件包含了所有的集合扩展方法。我们可以看到,我们在 Kotlin 中几乎可以使用 Java CollectionsKT 类中的所有方法.当然,也需要导入 java.util.* 。

让我们来看一下我们在 Java 代码中怎么调用 Kotlin 集合:

java.util.List list = kotlin.collections.CollectionsKt.listOf(3, 4, 5);
java.util.List filteredList = CollectionsKt.filter(list, item -> item > 4);

你现在可以很清楚的看到 Kotlin 集合是如何使用 Java 的 List 。所有扩展函数都可以作为静态方法访问。

总结

Android 开发语言 Kotlin 是一门非常有趣的语言。它能帮助我们编写更加简洁和安全的代码。初次之外,Kotlin 与 Java 兼容。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
author-avatar
zulaka_208
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有