iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Kotlin的Collection与Sequence操作异同点是什么
  • 904
分享到

Kotlin的Collection与Sequence操作异同点是什么

2023-07-04 09:07:43 904人浏览 独家记忆
摘要

本文小编为大家详细介绍“Kotlin的Collection与Sequence操作异同点是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Kotlin的Collection与Sequence操作异同点是什么”文章能帮助大家解决疑惑,下面跟

本文小编为大家详细介绍“Kotlin的Collection与Sequence操作异同点是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Kotlin的Collection与Sequence操作异同点是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    Collection 的常见操作

    Collection 集合,Kotlin的集合类型和Java不一样,Kotlin的集合分为可变(读写)和不可变(只读)类型(lists, sets, maps, etc),可变类型是在不可变类型前面加Mutable,以我们常用的三种集合类型为例:

    List<out E> - MutableList<E>Set<out E> - MutableSet<E>Map<K, out V> - MutableMap<K, V>

    其实他们的区别就是List实现了Collection接口,而MutableList实现的是List和MutableCollection接口。而 MutableCollection 接口实现了Collection 接口,并且在里面添加了add和remove等操作方法。

    可变不可变只是为了区分只读和读写的操作,他们的操作符方式都是相同的。

    集合的操作符说起来可就太多了

    累计

    //对所有元素求和list.sum()//将集合中的每一个元素代入lambda表达式,然后对lambda表达式的返回值求和list.sumBy {    it % 2}//在一个初始值的基础上,从第一项到最后一项通过一个函数累计所有的元素list.fold(100) { accumulator, element ->    accumulator + element / 2}//同fold,只是迭代的方向相反list.foldRight(100) { accumulator, element ->    accumulator + element / 2}//同fold,只是accumulator的初始值就是集合的第一个元素,element从第二个元素开始list.reduce { accumulator, element ->    accumulator + element / 2}//同reduce但方向相反:accumulator的初始值就是集合的最后一个元素,element从倒数第二个元素开始往前迭代list.reduceRight { accumulator, element ->    accumulator + element / 2}val list = listOf(1, 2, 3, 4, 5, 6)//只要集合中的任何一个元素满足条件(使得lambda表达式返回true),any函数就返回truelist.any {    it >= 0}//集合中的全部元素都满足条件(使得lambda表达式返回true),all函数才返回truelist.all {    it >= 0}//若集合中没有元素满足条件(使lambda表达式返回true),则none函数返回truelist.none {    it < 0}//count函数的返回值为:集合中满足条件的元素的总数list.count {    it >= 0}

    遍历

    //遍历所有元素list.forEach {    print(it)}//同forEach,只是可以同时拿到元素的索引list.forEachIndexed { index, value ->    println("position $index contains a $value")}showFields.forEach { (key, value) ->

    最大最小

    //返回集合中最大的元素,集合为空(empty)则返回nulllist.max()//返回集合中使得lambda表达式返回值最大的元素,集合为空(empty)则返回nulllist.maxBy { it }//返回集合中最小的元素,集合为空(empty)则返回nulllist.min()//返回集合中使得lambda表达式返回值最小的元素,集合为空(empty)则返回nulllist.minBy { it }

    过滤(去除)

    //返回一个新List,去除集合的前n个元素list.drop(2)//返回一个新List,去除集合的后n个元素list.dropLast(2)//返回一个新List,去除集合中满足条件(lambda返回true)的第一个元素list.dropWhile {    it > 3}//返回一个新List,去除集合中满足条件(lambda返回true)的最后一个元素list.dropLastWhile {    it > 3}//返回一个新List,包含前面的n个元素list.take(2)//返回一个新List,包含最后的n个元素list.takeLast(2)//返回一个新List,仅保留集合中满足条件(lambda返回true)的第一个元素list.takeWhile {    it>3}//返回一个新List,仅保留集合中满足条件(lambda返回true)的最后一个元素list.takeLastWhile {    it>3}//返回一个新List,仅保留集合中满足条件(lambda返回true)的元素,其他的都去掉list.filter {    it > 3}//返回一个新List,仅保留集合中不满足条件的元素,其他的都去掉list.filterNot {    it > 3}//返回一个新List,仅保留集合中的非空元素list.filterNotNull()//返回一个新List,仅保留指定索引处的元素list.slice(listOf(0, 1, 2))

    映射

    //将集合中的每一个元素代入lambda表达式,lambda表达式必须返回一个元素//map的返回值是所有lambda表达式的返回值所组成的新List//例如下面的代码和listOf(2,4,6,8,10,12)将产生相同的Listlist.map {    it * 2}//将集合中的每一个元素代入lambda表达式,lambda表达式必须返回一个集合//而flatMap的返回值是所有lambda表达式返回的集合中的元素所组成的新List//例如下面的代码和listOf(1,2,2,3,3,4,4,5,5,6,6,7)将产生相同的Listlist.flatMap {    listOf(it, it + 1)}//和map一样,只是lambda表达式的参数多了一个indexlist.mapindexed { index, it ->    index * it}//和map一样,只不过只有lambda表达式的非空返回值才会被包含在新List中list.mapNotNull {    it * 2}//根据lambda表达式对集合元素进行分组,返回一个Map//lambda表达式的返回值就是map中元素的key//例如下面的代码和mapOf("even" to listOf(2,4,6),"odd" to listOf(1,3,5))将产生相同的maplist.groupBy {    if (it % 2 == 0) "even" else "odd"}

    元素

    list.contains(2)list.elementAt(0)//返回指定索引处的元素,若索引越界,则返回nulllist.elementAtOrNull(10)//返回指定索引处的元素,若索引越界,则返回lambda表达式的返回值list.elementAtOrElse(10) { index ->    index * 2}//返回list的第一个元素list.first()//返回list中满足条件的第一个元素list.first {    it > 1}//返回list的第一个元素,list为empty则返回nulllist.firstOrNull()//返回list中满足条件的第一个元素,没有满足条件的则返回nulllist.firstOrNull {    it > 1}list.last()list.last { it > 1 }list.lastOrNull()list.lastOrNull { it > 1 }//返回元素2第一次出现在list中的索引,若不存在则返回-1list.indexOf(2)//返回元素2最后一次出现在list中的索引,若不存在则返回-1list.lastIndexOf(2)//返回满足条件的第一个元素的索引list.indexOfFirst {    it > 2}//返回满足条件的最后一个元素的索引list.indexOfLast {    it > 2}//返回满足条件的唯一元素,如果没有满足条件的元素或满足条件的元素多于一个,则抛出异常list.single {    it == 5}//返回满足条件的唯一元素,如果没有满足条件的元素或满足条件的元素多于一个,则返回nulllist.singleOrNull {    it == 5}

    排序&逆序

    val list = listOf(1, 2, 3, 4, 5, 6)//返回一个颠倒元素顺序的新集合list.reversed()list.sorted()//将每个元素代入lambda表达式,根据lambda表达式返回值的大小来对集合进行排序list.sortedBy {    it*2}list.sortedDescending()list.sortedByDescending {    it*2}personList.sortWith(compareBy({ it.age }, { it.name })) val c1: Comparator<Person> = Comparator { o1, o2 ->       if (o2.age == o1.age) {             o1.name.compareTo(o2.name)      } else {           o2.age - o1.age       } }personList.sortWith(c1)  //上面的自定义方式可以通过JavaBean实现Comparable 接口实现自定义的排序    data class Person(var name: String, var age: Int) : Comparable<Person> {     override fun compareTo(other: Person): Int {         if (this.age == other.age) {               return this.name.compareTo(other.name)          } else {             return other.age - this.age          }      }   } //sorted 方法返回排序好的list(已有有排序规则的用sorted,不要用sortedby了) val sorted = personList.sorted()

    Sequence 的常见操作

    Sequence 是 Kotlin 中一个新的概念,用来表示一个延迟计算的集合。Sequence 只存储操作过程,并不处理任何元素,直到遇到终端操作符才开始处理元素,我们也可以通过 asSequence 扩展函数,将现有的集合转换为 Sequence ,代码如下所示

        val list = mutableListOf<Person>()    for (i in 1..10000) {        list.add(Person("name$i", (0..100).random()))    }    list.asSequence()

    当我们拿到结果之后我们还能通过toList再转换为集合。

      list.asSequence().toList()

    Sequence的操作符绝大部分都是和 Collection 类似的。常用的一些操作符是可以直接平替使用的。

      val list2 = list.asSequence()    .filter {        it.age > 50    }.map {        it.name    }.take(3).toList()

    居然他们的操作符都长的一样,效果也都一样,导致 Sequence 与 Collection 就很类似,那么既生瑜何生亮!为什么需要这么个东西?既然 Collection 能实现效果为什么还需要 Sequence 呢?他们的区别又是什么呢?

    区别与对比

    Collection 是立即执行的,每一次中间操作都会立即执行,并且把执行的结果存储到一个容器中,没多一个中间操作符就多一个容器存储结果。

    public inline fun <T, R> Iterable<T>.map(transfORM: (T) -> R): List<R> {  return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)}public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {    return filterTo(ArrayList<T>(), predicate)}

    比如常用的 map 和 filter 都是会新建一个 ArrayList 去存储结果,

    Sequence 是延迟执行的,它有两种类型,中间操作和末端操作 ,主要的区别是中间操作不会立即执行,它们只是被存储起来,中间操作符会返回另一个Sequence,仅当末端操作被调用时,才会按照顺序在每个元素上执行中间操作,然后执行末端操作。

    public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R> {    return TransformingSequence(this, transform)}public fun <T> Sequence<T>.filter(predicate: (T) -> Boolean): Sequence<T> {    return FilteringSequence(this, true, predicate)}

    比如常用的 map 和 filter 都是直接返回 Sequence 的this 对象。

    public inline fun <T> Sequence<T>.first(predicate: (T) -> Boolean): T {    for (element in this) if (predicate(element)) return element    throw NoSuchElementException("Sequence contains no element matching the predicate.")}

    然后在末端操作中,会对 Sequence 中的元素进行遍历,直到预置条件匹配为止。

    这里我们举一个示例来演示一下:

    我们使用同样的筛选与转换,来看看效果

            val list = mutableListOf<Person>()        for (i in 1..10000) {            list.add(Person("name$i", (0..100).random()))        }        val time = measureTimeMillis {            val list1 = list.filter {                it.age > 50            }.map {                it.name            }.take(3)            YYLogUtils.w("list1$list1")        }        YYLogUtils.w("耗费的时间$time")        val time2 = measureTimeMillis {            val list2 = list.asSequence()                .filter {                    it.age > 50                }.map {                    it.name                }.take(3).toList()            YYLogUtils.w("list2$list2")        }        YYLogUtils.w("耗费的时间2$time2")

    运行结果:

    当集合数量为10000的时候,执行时间能优秀百分之50左右:

    Kotlin的Collection与Sequence操作异同点是什么

    当集合数量为5000的时候,执行时间相差比较接近:

    Kotlin的Collection与Sequence操作异同点是什么

    当集合数量为3000的时候,此时的结果就反过来了,Sequence延时执行的优化效果就不如List转换Sequence再转换List了:

    Kotlin的Collection与Sequence操作异同点是什么

    读到这里,这篇“Kotlin的Collection与Sequence操作异同点是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Kotlin的Collection与Sequence操作异同点是什么

    本文链接: https://www.lsjlt.com/news/344122.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Kotlin的Collection与Sequence操作异同点是什么
      本文小编为大家详细介绍“Kotlin的Collection与Sequence操作异同点是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Kotlin的Collection与Sequence操作异同点是什么”文章能帮助大家解决疑惑,下面跟...
      99+
      2023-07-04
    • Kotlin的Collection与Sequence操作异同点详解
      目录前言累计遍历最大最小过滤(去除)映射元素排序&逆序Sequence 的常见操作区别与对比总结前言 在Android开发中,集合是我们必备的容器,Kotlin的标准库中提供...
      99+
      2022-11-13
      Kotlin Collection Sequence异同 Kotlin Collection Sequence
    • Kotlin与Java的异同点有哪些
      这篇文章主要介绍“Kotlin与Java的异同点有哪些”,在日常操作中,相信很多人在Kotlin与Java的异同点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Kotlin与Java的异同点有哪些”的疑...
      99+
      2023-06-02
    • null与undefined的异同点是什么
      这篇“null与undefined的异同点是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
      99+
      2024-04-02
    • 进程与线程异同点是什么
      这篇文章主要讲解了“进程与线程异同点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“进程与线程异同点是什么”吧!关于这个问题,有的同学可能已经背得滚瓜烂熟了:“进程是操作系统分配资源的单...
      99+
      2023-06-27
    • vue中el-autocomplete与el-select的异同点是什么
      这篇文章主要介绍“vue中el-autocomplete与el-select的异同点是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue中el-autocomplete与el-select的异...
      99+
      2023-06-30
    • mysql sequence的作用是什么
      MySQL中的序列(sequence)是一种生成连续、唯一值的对象。它可以用于生成自增的数字或者其他类型的序列,例如日期、时间戳等。...
      99+
      2024-04-09
      mysql
    • PHP中的数组有哪些常用操作方式?与NumPy的相同点和差异是什么?
      PHP中的数组是一种非常常见的数据类型,可以存储多个值,并且可以通过索引访问和操作数组中的元素。在本文中,我们将介绍PHP中的数组常用操作方式,并将其与NumPy进行比较,以便更好地理解它们之间的相同点和差异。 一、PHP中的数组常用操作方...
      99+
      2023-08-26
      数组 numpy spring
    • link和@import的异同点是什么
      这篇文章主要讲解了“link和@import的异同点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“link和@import的异同点是什么”吧!页面中使用CSS的方式主要有3种:行内添加...
      99+
      2023-06-08
    • Hadoop和Spark异同点是什么
      这篇“Hadoop和Spark异同点是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Hadoop和Spark异同点是什么...
      99+
      2023-06-27
    • Typescript中interface与type的相同点与不同点是什么
      今天小编给大家分享一下Typescript中interface与type的相同点与不同点是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
      99+
      2023-07-04
    • oracle中sequence的作用是什么
      在Oracle数据库中,Sequence(序列)是一种用于生成唯一数字值的数据库对象。它被广泛用于为表的主键字段生成唯一标识,也可以...
      99+
      2024-04-09
      oracle
    • HTLM,HTLM5和Flash的异同点是什么
      这篇文章主要介绍“HTLM,HTLM5和Flash的异同点是什么”,在日常操作中,相信很多人在HTLM,HTLM5和Flash的异同点是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
      99+
      2024-04-02
    • Promise异步操作是什么
      这篇文章主要讲解了“Promise异步操作是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Promise异步操作是什么”吧!什么是异步操作?所谓异步操作,指的是可以跟当前程序同时执行的操...
      99+
      2023-06-03
    • WCF和Web Service异同点是什么
      本篇内容主要讲解“WCF和Web Service异同点是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“WCF和Web Service异同点是什么”吧!我们大家都知道WCF服务,有些人说会了W...
      99+
      2023-06-17
    • Go语言与Golang的异同是什么?
      Go和Golang是同一种编程语言,它们并没有实质性的区别。"Go"是该编程语言的正式名称,在官方文档和社区中使用广泛。而"Golang"则是Go语言在搜索引擎中的常用关键词,有时人们...
      99+
      2024-02-25
      go golang 异同 go语言
    • spawn与exec的相同点是什么
      本篇内容主要讲解“spawn与exec的相同点是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spawn与exec的相同点是什么”吧!   Node.js...
      99+
      2024-04-02
    • Spring 中的 load 方法与编程算法的异同点是什么?
      Spring 是一个流行的 Java 开发框架,它提供了丰富的功能和工具,使得开发人员能够更加高效地编写 Java 应用程序。其中一个重要的功能就是 load 方法,它被广泛地应用于 Spring 应用程序中。在本文中,我们将探讨 Spr...
      99+
      2023-10-15
      load spring 编程算法
    • Kotlin与Java的区别是什么
      Kotlin与Java的区别可以总结如下:1. 语法简洁:Kotlin的语法相对于Java更简洁易读,减少了冗余的代码和样板代码。例...
      99+
      2023-08-14
      Kotlin Java
    • javascript的异步操作方法是什么
      这篇“javascript的异步操作方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作