【Kotlin】集合操作

Kotlin 集合操作篇

    • 背景
    • 集合类型
    • 集合操作
      • 加减操作
      • 并集
      • 交集
      • 集合分组
      • 集合转换
        • flatMap
        • flatMapIndexed
        • flatMapTo
        • mapIndexed
        • mapIndexedTo
        • reduceIndexed
        • flatten

背景

在经过一段时间的kotlin实践后,发现它真的很适合我们当前的业务场景,一方面它可以和Java无缝结合,兼容老业务,另一方面,由于经常需要对数据集合做各种遍历转换的操作,而kotlin在这方面的提供了比Java更加简洁、易读的函数。

集合类型

跟Java类似,在Kotlin中,常用的集合有如下三类:

  • List
  • Set
  • Map

根据集合是否只读,在创建集合时又可划分为:Read-only CollectionsMutable Collections 两种

  • Read-only Collections
    • listOf():
    • setOf()
    • mapOf()
fun main() {val list = listOf(1, 2, 3, 4, 5)val set = setOf(1, 1, 3, 4, 5)val map = mapOf(1 to "a", 2 to "b")println(list.toString())println(set.toString())println(map.toString())
}// result
[1, 2, 3, 4, 5]
[1, 3, 4, 5]
{1=a, 2=b}
  • Mutable Collections
    • mutableListOf()
    • MutableSetOf()
    • mutableMapOf()
val list1 = mutableListOf(1, 2, 3, 4, 5)list1.add(6)val set1 = mutableSetOf(1, 1, 3, 4, 5)set1.add(6)val map1 = mutableMapOf(1 to "a", 2 to "b")map1[3] = "C"
// resultprintln(list.toString())println(set.toString())println(map1.toString())

集合操作

记录一些业务常用的集合操作:

加减操作

val list2 = listOf(1, 2, 3, 4, 5)val ans1 = list2 +  listOf(1, 2, 3, 4, 5)val ans2 = list2 - mutableListOf(1, 2)println(ans1.toString())println(ans2.toString())// result
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
[3, 4, 5]

并集

 val list2 = listOf(1, 2, 3, 4, 5)val ans3 = list2.union(listOf(6))println("并集: $ans3")
// result
并集: [1, 2, 3, 4, 5, 6]

交集

val list2 = listOf(1, 2, 3, 4, 5)// 使用 intersect 函数获取交集val intersection = list2.intersect(listOf(1, 2, 3))println("交集: $intersection")// result
交集: [1, 2, 3]

集合分组

  • groupBy:分组后,value会是一个列表,出现相同key时,value会在一个列表中。
  • associateBy:出现相同key时,value只会有一个
 val list2 = listOf(1, 1, 2, 3, 4, 5)val ans4 = list2.groupBy { it }val ans5 = list2.associateBy { it }println("groupBy: $ans4")println("associateBy: $ans5")
// result
groupBy: {1=[1, 1], 2=[2], 3=[3], 4=[4], 5=[5]}
associateBy: {1=1, 2=2, 3=3, 4=4, 5=5}

集合转换

flatMap
  val list = listOf(listOf(1, 2, 3), listOf(4, 5, 6), listOf(7, 8, 9))// 使用 flatMap() 将嵌套列表展平为单个列表val flatList = list.flatMap { it }println(flatList) // 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
flatMapIndexed
val list = listOf(listOf(1, 2, 3), listOf(4, 5, 6), listOf(7, 8, 9))// 使用 flatMapIndexed() 将嵌套列表展平为单个列表,并保留索引val flatListIndexed = list.flatMapIndexed { index, sublist -> sublist.map {index to it } }println(flatListIndexed) // 输出: [(0, 1), (0, 2), (0, 3), (1, 4), (1, 5), (1, 6), (2, 7), (2, 8), (2, 9)]
flatMapTo
  val list = listOf(listOf(1, 2, 3), listOf(4, 5, 6), listOf(7, 8, 9))// 使用 flatMapTo() 将嵌套列表展平为单个列表,并将结果添加到指定集合中val flatListTo = mutableListOf<Int>()list.flatMapTo(flatListTo) { it }println(flatListTo) // 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
mapIndexed
val list = listOf(listOf(1, 2, 3), listOf(4, 5, 6), listOf(7, 8, 9))// 使用 mapIndexed() 对列表中的元素进行索引转换val mappedListIndexed = list.mapIndexed { index, sublist -> sublist.map {index to it } }println(mappedListIndexed) 
// 输出: 
//[[(0, 1), (0, 2), (0, 3)], [(1, 4), (1, 5), (1, 6)], [(2, 7), (2, 8), (2, 9)]]
mapIndexedTo
 val list = listOf(listOf(1, 2, 3), listOf(4, 5, 6), listOf(7, 8, 9))// 对列表中的元素进行索引转换 并赋值到一个新列表,val multipliedList = mutableListOf<List<Pair<Int, Int>>>()list.mapIndexedTo(multipliedList) { index, value -> value.map {index to it} }
// [[(0, 1), (0, 2), (0, 3)], [(1, 4), (1, 5), (1, 6)], [(2, 7), (2, 8), (2, 9)]]
reduceIndexed

count: 默认情况下,取列表的第一个元素为初始值, 每次计算结果为保存在count

val numbers = listOf(2, 2, 3, 4, 5)// 使用 reduceIndexed 计算每个元素与其索引的乘积之和val product = numbers.reduceIndexed { index, count, value ->println(count)  // 2 4 10 22count + (index * value)}// 42
flatten
val nestedList = listOf(listOf(1, 2, 3), listOf(4, 5), listOf(6, 7, 8))// 使用 flatten 将嵌套列表平铺val flatList = nestedList.flatten()// 平铺列表: [1, 2, 3, 4, 5, 6, 7, 8]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot Whitelabel Error Page 报错--【已解决】

springboot 报错信息如下 这个报错页面就是个404 &#xff0c;代表你访问的url 没有对应的的requestmapping 其实没啥影响的一个问题&#xff0c;但是看到Error 就是不爽&#xff0c;改了他丫的 解决方法如下 一、调整application.properties配置【治标不治本】 server.err…

GPT与ArcGISPro结合编程,地理空间分析,图绘制、渲染

在地学领域&#xff0c;ArcGIS几乎成为了每位科研工作者作图、数据分析的必备工具&#xff0c;而ArcGIS Pro3除了良好地继承了ArcMap强大的数据管理、制图、空间分析等能力&#xff0c;还具有二三维融合、大数据、矢量切片制作及发布、任务工作流、时空立方体等特色功能&#x…

测试中调用别人的服务,单元测试写法

在Java中&#xff0c;进行单元测试时调用别人的服务&#xff0c;可以使用单元测试框架如JUnit&#xff0c;并结合模拟框架如Mockito来模拟或替代外部服务。 以下是一个示例&#xff0c;展示了在Java中进行单元测试时调用外部服务的写法&#xff1a; java import org.junit.Te…

JVM虚拟机运行时数据区程序计数器和元空间和线程控制块

阅读前提是对虚拟机有一定的理解 文章目录 阅读前提是对虚拟机有一定的理解16.堆、(方法区)元空间、虚拟机栈、程序计数器、本地方法栈16.1每个线程私有pc、vms、nms,共享 堆和堆外空间&#xff08;元空间等&#xff09; 1.虚拟机中运行时数据区中的方法区被元空间取代2. 用于存…

Jmeter自动判定运行结果(断言)

大家知道在jmeter中如果要查看运行结果可以通过添加监听器里面的查看结果树进行验证&#xff0c;但是这种方式查看结果依然是通过人眼进行比对的&#xff0c;为了能够解放双眼&#xff0c;可以通过jmeter自带的断言功能进行结果的自动判定&#xff0c;这样也算是进行一个简单的…

Apache Seatunnel本地源码构建编译运行调试

Apache Seatunnel本地源码构建编译运行调试 文章目录 1. 环境准备1.1 Java环境1.2 Maven1.3 IDEA1.4 Docker环境1.5 Mysql8.0.281.6 其它环境准备 2. 源码包下载3. idea项目配置3.1 项目导入3.2 maven配置3.3 项目JDK配置3.4 项目启动参数配置3.4.1 seatunnel项目启动参数配置3…

检查指定的进程(默认为java.exe)是否正在运行

echo off set "processNamejava.exe" REM 替换为您要检查的进程名称REM 使用 tasklist 命令获取进程列表&#xff0c;并使用 findstr 命令搜索指定的进程名称 for /f "tokens1-3 delims " %%a in (tasklist ^| findstr /i "%processName%") do …

Qt之使用QListView加载相册(富文本ToolTip)

一.效果 二.实现 #include "mainwindow.h" #include "ui_mainwindow.h"#include <QStandardItemModel> #include <QFont>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QFont…

内衣洗衣机好用吗?专门洗内衣内裤的热门小型洗衣机

随着人们的生活水平的提升&#xff0c;越来越多小伙伴来开始追求更高的生活水平&#xff0c;一些智能化的小家电就被发明出来&#xff0c;而且内衣洗衣机是其中一个。现在通过内衣裤感染到细菌真的是越来越多&#xff0c;所以我们对内衣裤的清洗频次会高于普通衣服&#xff0c;…

【赠书活动】OpenCV4工业缺陷检测的六种方法

文章目录 前言机器视觉缺陷检测工业上常见缺陷检测方法延伸阅读推荐语 赠书活动 前言 随着工业制造的发展&#xff0c;对产品质量的要求越来越高。工业缺陷检测是确保产品质量的重要环节&#xff0c;而计算机视觉技术的应用能够有效提升工业缺陷检测的效率和精度。 OpenCV是一…

【数据结构】八大排序之简单选择排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.简单选择排序简介及思路 二.简单选择排序的代码实现 三.简单选择排序的优化 四.简单选择排序的时间复杂度分析 结语 一.简单选择排序简介及思路 简单选择排序算法…

Koa.js 入门手册:洋葱模型插件机制详解以及常用中间件

前言 Nodejs 提供了 http 能力&#xff0c;我们通过如下代码可以快速创建一个http server服务 const http require(http);http.createServer((req, res) > {res.write(hello\n);res.end();}).listen(3000);使用nodejs提供的原生能力启动一个http server并不麻烦&#xff…

css 2D转换

转换&#xff08;transorm&#xff09;是css3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果。 1.移动&#xff1a;translate 语法&#xff1a; transform:translate(x,y)或者分开写 transform:translateX&#xff08;n&#xff09; ​transform:t…

【合并两个pandas的DataFrame】

如果你想合并两个pandas DataFrame&#xff0c;可以使用concat、merge或join函数。 1、 使用concat函数: 这个函数用于沿着一条轴将多个对象堆叠到一起。 import pandas as pd # 创建两个示例的DataFrame df1 pd.DataFrame({A: [1, 2], B: [3, 4]}) df2 pd.DataFrame({A: […

界面控件DevExpress WPF Dock组件,轻松创建类Visual Studio窗口界面!

本文主要为大家介绍DevExpress WPF控件中的Dock组件&#xff0c;它能帮助用户轻松创还能受Microsoft Visual Studio启发的Dock窗口界面。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress …

Python入门必看的关键字教程,清晰易懂

文章目录 前言FalseNoneTrueand,orasassertbreak与continueclassdefdelif,elif,elsetry,except,finally,raisefor,in,whileimport,fromglobalislambdanonlocalnotpassreturnwithyield、async 与 awaitPython技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频…

SpringBoot监听器

在Spring Boot中&#xff0c;你可以使用监听器来响应特定的事件。这些事件可以是Spring Boot应用生命周期中的某个阶段&#xff08;如启动、关闭等&#xff09;&#xff0c;也可以是你自定义的业务事件。 1. 创建一个监听器 创建一个监听器有两种方法&#xff1a;实现Applica…

每天五分钟计算机视觉:谷歌的Inception模块的计算成本的问题

计算成本 Inception 层还有一个问题,就是计算成本的问题,我们来看一下55 过滤器在该模块中的计算成本。 原始图片为28*28*192经过32个5*5的过滤操作,它的计算成本为: 我们输出28*28*32个数字,对于输出的每个数字来说,你都需要执行 55192 (5*5为卷积核的大小,192为通道…

如何通过EventChannel实现Flutter与原生平台之间的双向通信

本文将介绍如何通过EventChannel实现Flutter与原生平台之间的双向通信。如果想了解如何通过MethodChannel实现Flutter调用Android原生平台的方法,可以参考上篇文章。 Flutter如何实现与Android底层平台通信,调用底层Android原生方法https://sgknight.blog.csdn.net/article/…

威雅学校快讯:携手未来,同梦而行,威雅学校喜迎英国姐妹校管理团队访校视察

威雅学校喜迎英国姐妹校访校团 Visit from our sister school in the UK 英国威科姆阿贝学校 威雅学校大家庭 WAS Family 常州威雅WASCZ 香港威雅WASHK 杭州威雅WASHZ 南京威雅WASNJ 向春而行&#xff0c;卓越可期。日前&#xff0c;四所威雅学校均先后迎来了英国姐妹学校W…