Kotlin学习-集合和序列(3)

Kotlin 惰性集合操作-序列 Sequence Kotlin 标准库提供的集合操作函数:filter,map, flatmap 等,在操作的时候会创建存储中间结果的临时列表,当集合元素较多时,这种链式操作就会变得低效。为了解决这种问题,Kotlin 提供了惰性集合操作Sequence接口,只有在 末端操作被调用的时候,也就是获取结果的时候,序列中的元素才会被逐个执行,处理完第一个元素后,才会处理第二个元素,这样中间操作是被延期执行的。而且因为是顺序地去执行每一个元素,所以可以先做 filter 变换,再做 map 变换,这样有助于减少变换的总次数。 阅读详情


前面两篇我们学习了 Kotlin 学习-基础语法(1)和 Kotlin学习-函数的定义和调用(2)

这次来看下kotlin中的集合和序列。

1.集合

1.1 集合的写法

首先我们来看下kotlin中集合的几种写法,如下:

private fun testList() {
    val list1 = listOf(1, 2, 3)
    val list2 = mutableListOf(4, 5, 6)

    println("list1 = $list1")
    println("list2 = $list2")
}
>>> list1 = [1, 2, 3]
>>> list2 = [4, 5, 6]

上面的listOf() 表示不可变的列表, mutableListOf()表示可变的列表。在kotlin中,集合list,map,set都有两种写法,可变和不可变。

1.2 集合的函数式API
  • filter和map
    filter:可以移除不想要的元素。起过滤的作用
    map:可以把每一个元素给映射到另一个新集合中。起变换的作用
    我们看一个例子:
fun testApi(){
    listOf(1, 2, 3, 4)
        .map {
            println("item1 = $it")
            it * it
        }.filter {
            println("item2 = $it")
            it > 4
        }
}
>>>item1 = 1
item1 = 2
item1 = 3
item1 = 4
item2 = 1
item2 = 4
item2 = 9
item2 = 16

从上面的例子可以看出filter和map的作用,很方便的做集合进行操作。但也可以看出来,上面的两个日志将list都执行了一遍,有点没有必要,我们调整下顺序再看下。

fun testApi2(){
    listOf(1, 2, 3, 4)
        .filter {
            println("item1 = $it")
            it > 3
        }.map {
            println("item2 = $it")
            it * it
        }
}
>>>item1 = 1
item1 = 2
item1 = 3
item1 = 4
item2 = 4

可以看到将filter放到前面,map放到后面执行,最后map只执行了一次。
由此可见,合理的编写代码的顺序是可以提高程序性能的。

  • all,any,find,count
    上面说过了常用的map和filter,这里再简单的介绍下all,any,find,count。
    all:判断所有元素是否都满足条件;
    any:是否至少有一个元素满足条件;
    find:找到一个满足条件的元素就返回;
    count:有多少个元素满足条件;

看下下面的例子执行可以更直观的理解:

fun testApi3(){
    val list = listOf(1, 2, 3, 4)

    println("test all: ${list.all { it >3 }}")
    println("test any: ${list.any { it > 3 }}")
    println("test find: ${list.find { it > 3 }}")
    println("test count: ${list.count { it > 3 }}")
}
>>>test all: false
test any: true
test find: 4
test count: 1

以上的api灵活的使用可以大大的提高你的开发速度。

2.序列

在kotlin中除了集合外还有一种惰性集合:序列。
有了集合为什么还要设计序列呢,他们有什么不同呢,可以看这位大神的文章,让你迷惑的 Kotlin 代码,再来一道~

我们这里只介绍下这个序列到底咋回事。kotlin的惰性集合入口是Sequence接口,表示的是一个可以逐个列举元素的元素序列,我们先用一个例子看下:

fun testSequence() {
    listOf(Person("Jay", 20),
        Person("Tom", 30),
        Person("Carry", 40))
        .asSequence()
        .map {
            println("map, $it")
            it.age
        }.filter {
            println("filter, $it")
            it > 30
        }
}
>>> 啥也没输出

搞完代码一看啥也没输出,这是什么玩意,哪里出错了???看了下官方文档,发现将序列重新转为集合才会触发这个序列的执行,来试试。

fun testSequence() {
    val toList = listOf(
        Person("Jay", 20),
        Person("Tom", 30),
        Person("Carry", 40)
    )
        .asSequence()
        .map {
            println("map, $it")
            it.age
        }.filter {
            println("filter, $it")
            it > 30
        }.toList()
    println("toList: $toList")
}
>>>map, Person(name=Jay, age=20)
filter, 20
map, Person(name=Tom, age=30)
filter, 30
map, Person(name=Carry, age=40)
filter, 40
toList: [40]

从日志打印可以印证序列的定义:可以逐个列举元素的元素序列。
那既然最后的结果和集合是一样的,为什么要设计序列呢?
首先,我们看下官方序列的适应场景:需要对一个大型集合执行链式操作时要使用序列。集合的每步操作会创建中间集合,如果集合比较大,那么中间集合的重新分配会消耗巨大,影响执行性能。

3.集合和序列的区别

通过上面的集合和序列的了解,不难看出它们的区别。下面画张图形象的看下:
集合和序列的区别
到这里我们kotlin的集合和序列的介绍就结束了,具体的应用场景还需要结合自己的项目去使用最适合的。学无止境,继续搬砖吧。

高性能的集合工具——序列(Kotlin中的序列) 简单介绍集合中几种方法的应用和另外一种可替代的方案Sequence的应用 阅读详情

相关推荐

kotlinx.serialization,Kotlin跨平台/多格式序列化.zip

kotlin序列化包括一个编译器插件,它自动为类生成访问者代码,以及运行库,它使用生成的代码来序列化对象而不需要反射。

kotlin集合和序列

kotlin提供了两种使用集合的方式,Collections和Sequences(集合与序列),下面讲下两者区别及如何使用。 集合vs序列 即时求值和延迟求值的区别在于每次transform执行的时候。 集合是每次transform执行时立即计算的,并且计算结果会存储在一个新的集合里面。集合的每个transform是内联方法,例如集合的map方法: public inli...

698

ContextCapture导入点云进行重建

ContextCapture导入点云进行重建

天桥飞熊的博客 1万+

Android kotlin序列化之@Parcelize详解与使用

如果在使用过程中,通过注解发生了数据异常,需要检查对象是否序列化了,如果通过构造器的,查看方法体是否参与了,如果是很简单的数据建议构造器,如果是复杂的数据,建议抛弃构造器如果采用了注解,就不能使用类中定义类这种用法,否则对象获取为null。那用什么?接下来我会介绍抛弃注解,直接使用手写。

1万+

PDMS二次开发入门:手把手教你用PML2写第一个交互式窗体工具

本文详细介绍了如何使用PML2进行AVEVA PDMS二次开发,从零开始构建交互式窗体工具。通过PML2语言的面向对象特性、即时调试能力和深度系统集成优势,开发者可以高效创建自动化设计工具、批量修改属性和定制报表系统。文章包含开发环境配置、基础语法、窗体架构设计、事件处理等实战内容,帮助读者快速掌握PDMS二次开发技能。

weixin_29281941的博客 271

MPN – 制造商物料编号(延伸)

此外,用户还可以在物料主数据中定义阻止MPN材料的原因,以及在采购订单创建时,是否可以将现有的MPN材料修改为其他MPN材料,从而实现对MPN材料的精细控制和管理。通过使用AMPL,用户可以指定每个MPN材料是否仅能为特定工厂或整个企业所有工厂采购、采购的时间段、是否必须属于特定修订级别、是否只能从特定制造商工厂采购以及是否被阻止及其原因。通过AMPL管理,企业可以规范采购流程,避免使用未经批准的材料,从而提高采购的透明度和效率,同时也为质量控制提供了保障‌。3、QM中的制造商物料。质量信息记录QI01。

yanzibing99的博客 2486

Python学习(六)---序列与集合

Python学习(六)---序列与集合

weixin_47109902的博客 1188

车规级非易失存储选型指南:从AEC-Q100到ISO 26262的可靠性设计

非易失存储器是电子系统中负责长期保存关键数据与代码的核心组件,其可靠性直接决定了系统的长期稳定运行能力。在汽车电子领域,这一要求被提升到了极致,必须满足严苛的车规级标准。从原理上看,存储器的数据保持能力、擦写寿命等关键参数在高温、振动等恶劣环境下会急剧衰减,因此需要专门的设计与验证。其技术价值在于保障车辆全生命周期的功能安全与数据完整性,避免因存储失效导致的安全隐患或频繁维护。应用场景涵盖从发动机控制单元、自动驾驶域控制器到智能座舱的各类电子控制单元。本文聚焦于车规级非易失存储的选型,深入解析AEC-Q10

weixin_30938149的博客 457

序列类型(元组()、列表[]、字符串““)、集合类型({}、set())

组合数据类型能够将多个同类型或不同类型的数据组织起来 ,通过单一的表示使数据操作更有序更容易。根据数据之间的 关系,组合数据类型可以分为三类: 由于元素之间存在顺序关系,所以序列中可以存在相同数值但位置不同的元素。 序列类型支持成员关系操作符 : in操作:可以判断元素是否在序列中 len():长度计算函数 分片([])操作:元素本身也可以是序列类型,通过下标访问元素。 P

今天会营业的博客 2824

告别昂贵硬件!用Unity3D 2023 + ROS2 Humble搭建你的第一个SLAM仿真实验室(保姆级教程)

本文提供了一份详细的教程,介绍如何使用Unity3D 2023和ROS2 Humble搭建SLAM仿真实验室,无需昂贵硬件即可实现虚拟传感器模拟和算法测试。通过Docker容器配置、ROS2安装优化及Unity插件集成,开发者可以快速构建高精度的仿真环境,适用于自主导航、多传感器标定等场景。

weixin_42526353的博客 434

流体动力学仿真软件:Star-CCM+_(19).软件定制与脚本编写

自定义插件开发可以扩展Star-CCM+的功能,实现特定的仿真需求。插件开发通常需要使用Java语言,并且需要对Star-CCM+的API有深入的了解。以下是一个简单的Java插件示例,展示如何创建一个自定义插件来显示仿真项目的信息。// 导入必要的Star-CCM+ API import star . ccm . product . CCMProject;// 自定义插件类 public class CustomPlugin {// 插件主方法 public void run() {

kkchenjj的博客 937

【Kotlin】函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )

一、及早集合与惰性集合 二、惰性集合-序列 三、generateSequence 序列创建函数 1、函数简介 2、函数原型 3、函数简介 4、使用示例 四、序列代码示例 1、使用传统的函数式编程实现 2、使用序列 Sequence 实现 3、take 扩展函数分析

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1万+

基于YOLOv11的农作物病虫害检测系统设计与实现

我们使用公开的IP102病虫害数据集作为基础,该数据集包含102种病虫害类别,覆盖水稻、小麦、玉米等多种主要农作物。图像数量:75,222张类别数:102图像分辨率:从640×480到4000×3000不等标注格式:PASCAL VOC格式此外,我们还收集了部分田间实际拍摄的图像以增强模型泛化能力。

YOLO 595

Kotlin-数组,集合类以及序列

序列实际上是一个延迟获取数据的集合,只有需要元素时才会产生元素并提供给外部,包括所有对元素的操作也不是一次性全部处理,而是根据情况选择合适的元素进行操作,使用序列能够在处理大量数据时获得显著的性能提升。可以发现,序列根据我们的操作流程,对数据的操作也进行了优化,执行次数明显减少,并且只有我们从序列读取数据时才会执行定义好的工序。迭代器的出现,使得我们无论使用哪一种集合,都可以使用同样的方式对元素进行遍历。如果我们既需要通过筛选的元素,也需要未通过筛选的元素,可以使用分区操作。

2302_77179144的博客 1234

为什么 ChatGPT 生成的下载地址会长成 sky-metal-cards-jerry.quirkypony34.chatgpt.site 这种奇怪的样子

我今天看到的这条地址,确实很容易让人产生一种感觉,ChatGPT 明明只是生成了几张 PNG 图片和一个压缩包,为什么最终拿到的却不是类似这种看起来很正规的下载链接,而是一长串带有、UUID、apidecks的地址。更容易让人疑惑的是,其中还出现了一个平时很少见到的域名。这并不是浏览器随机生成的临时 URL,也不是某个来历不明的第三方文件服务器。根据 OpenAI 在 2026 年公布的 ChatGPT Sites 文档和相关服务条款,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 60

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Kotlin学习手记——集合变换、序列、聚合、SAM转换、DSL

/错误的写法,这样还是一个函数类型,传到removeOnEventListener方法里不能移除,如sql语言、gradle中的groovy语言等,kotlin可以方便的实现这些语言的写法。//acc是上次的计算结果,初始值为StringBuffer(),返回值跟初始值类型一样。性能会优化一些,因为每个元素只需要走一遍每个操作,而不是每个操作中将每个元素走一遍。fold和reduce有点递归的意思在里面,每次的结果都是基于上次的结果。//等价这种直接传lambda表达式的写法。的话,不会有输出,不加。

2501_90243502的博客 1184

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Kotlin 中的惰性集合(序列)

这是因为 Java 8 的流和 Kotlin 中的序列一样,也是惰性求值的,这就意味着 Java 8 的流也是存在中间操作和末端操作的,所以必须通过上面的一系列转换才行。而序列不一样,序列在执行链式操作时,会将所有的操作都引用在一个元素上,也就是说,第 1 个元素执行完所有的操作之后,第 2 个元素在去执行所有的操作,以此类推。我们知道序列是惰性求值的,所以上面创建的序列是不会把所有的自然数都列举出来的,只有在我们调用一个末端操作的时候,才去列举我们所需要的列表。数列,比如自然数数列就是一个无限的数列。

xingyu19911016的博客 1174

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Kotlin序列

Sequences(序列)提供了强大且高效的方式来处理数据集合,特别适合于:大型集合或数据流多步链式处理的场景惰性处理需求表达无限序列或生成序列的逻辑当你需要优化集合操作性能时,考虑使用Sequence是一个很好的选择。

Hello World! 1074

kotlin 特殊集合之序列

kotlin 特殊集合之序列 文章目录kotlin 特殊集合之序列正文1. 先看段代码,直观感受序列的优点,速度快2. sequence 创建3. 更深一步看 sequence 的原理4. sequence 懒加载优点 正文 1. 先看段代码,直观感受序列的优点,速度快 /**[1] 序列操作又称惰性集合操作,在对集合进行链式操作(映射、过滤、变换),不需要像普通集合那样,每进行一次数据操作都需要...

随遇而安的博客 420

Kotlin 学习笔记(十二)kotlin中 集合序列使用、操作符汇总、list和sequence比较

前言 本篇博客为本人学习Kotlin 中所遇到的问题,如果哪里写的不对,希望欧大佬帮忙指出,多谢。 1. 集合的基础使用 kotlin 中的集合主要为:Array、List、Set、Map , Sequence 1.1 数组 val arr = arrayOf("1",2,3,4) 1.2 List 不可变集合 ( listOf() ) val arr = arrayOf("1","2",...

魔都大白 2748

Kotlin系列之序列(Sequences)源码完全解析

简述: 好久没有发布原创文章,一如既往,今天开始Kotlin浅谈系列的第十讲,一起来探索Kotlin中的序列。序列(Sequences)实际上是对应Java8中的Stream的翻版。从之前博客可以了解到Kotlin定义了很多操作集合的API,没错这些函数照样适用于序列(Sequences),而且序列操作在性能方面优于集合操作.而且通过之前函数式API的源码中可以看出它们会创建很多中间集合,每个操作...

Mikyou的专栏 9059

【Kotlin】基础变量、集合和安全操作符

在Kotlin中,所有东西都是对象,在这个意义上讲我们可以在任何变量上调用成员函数和属性。 一些java中的基本数据类型可以有特殊的内部表示——例如,数字(int)、字符和布尔值可以在运行时表示为原生类型值

xoliu的博客 2926

Kotlin学习笔记16——集合概述

Kotlin学习笔记16——集合概述前言基本集合类型CollectionListMutableListSetMutableSetMapMutableMap空集合复制迭代器List 迭代器可变迭代器区间和数列区间数列实用函数序列构造序列使用尾巴 前言 上一篇我们学习了Kotlin中的委托,今天继续来学习Kotlin中的集合。集合的内容包含的比较多,分为两篇来学习,今天是学习的集合概述,包括集合分类,定义,以及简单使用。 基本集合类型 Kotlin 标准库提供了基本集合类型的实现: set、list 以及 ma

abs625的博客 710

Kotlin学习笔记——Kotlin基础

Kotlin学习手记——基本类型、变量、集合、数组、区间、函数声明

川峰的博客 6168

kotlin 序列_Kotlin,合集和序列

kotlin 序列 当将流添加到Java 8时,我想加入潮流。 我阅读了博客文章,观看了视频,参加了研讨会,以了解所有内容。 过了一会儿,我变得足够自在...但是我对实现感到不满意:虽然流提供了具有功能性方法的方法,但是传统集合却没有。 如果要在现有集合上使用Java功能,则需要将后者转换为流,然后再次返回。 例如,以下代码通过流传输步骤从集合中筛选出一些元素: List<Strin...

dlz00001的博客 151

Kotlin学习之集合

但有时如果仅仅想重复一件事情n次,那就没有必要用Ranges,虽然它也可以,这时最为方便的是函数repeat,它与区间的唯一区别是repeat是没有返回值的,它仅是把一件事情重复n次,但没有返回值也就是说没有办法再转化为其他数组或者列表。Ranges是一个数据结构代表着一个区间,这个区间可能是一个整数范围,也可能是一个字符范围,其实也可以是其他自定义数据类型,只要能表达 出区间的概念。以外,还有对象的容器也非常的重要,比如线性容器(数组,列表和Set)和二维容器(哈希表)等。

稀有猿诉 1251
上一篇: android app图标长按展示快捷方式 Shortcuts 类似3d touch
coder_yao
博客等级 码龄10年 9粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值