当前位置: 首页 > news >正文

Kotlin 数据容器 - List 扩展(转换操作、过滤操作、排序操作、分组操作、集合操作、归纳操作、窗口操作)

List 概述

  1. List 是一个不可变的有序集合,一旦创建就不能修改其内容,即不能添加、删除、更改元素

  2. List 提供了丰富的操作函数来处理数据


一、转换操作

  1. 对 List 中的每个元素应用给定的转换函数
val nums = listOf(1, 2, 3)println("nums: $nums")val newNums = nums.map { it * 2 }println("newNums: $newNums")
# 输出结果nums: [1, 2, 3]
newNums: [2, 4, 6]
  1. 对 List 中的每个元素应用给定的转换函数,同时提供元素的索引和值作为参数
val nums = listOf(1, 2, 3)println("nums: $nums")val newNums = nums.mapIndexed { idx, value ->"$idx-$value"
}println("newNums: $newNums")
# 输出结果nums: [1, 2, 3]
newNums: [0-1, 1-2, 2-3]
  1. 将嵌套 List 的所有元素合并到一个 List 中
val list1 = listOf(listOf(1, 2), listOf(3, 4))println("list1: $list1")val list2 = list1.flatten()println("list2: $list2")
# 输出结果list1: [[1, 2], [3, 4]]
list2: [1, 2, 3, 4]

二、过滤操作

  1. 过滤出指定类型的元素
val mixed = listOf(1, "A", 2, "B", 3)println("mixed: $mixed")val nums = mixed.filterIsInstance<Int>()println("nums: $nums")
# 输出结果mixed: [1, A, 2, B, 3]
nums: [1, 2, 3]
  1. 过滤出满足条件的元素
val nums = listOf(1, 2, 3, 4, 5)println("nums: $nums")val result = nums.filter { it % 2 == 0 }println("result: $result")
# 输出结果nums: [1, 2, 3, 4, 5]
result: [2, 4]
  1. 过滤掉为 null 的元素
val mixed = listOf(1, null, 2, null, 3)println("mixed: $mixed")val result = mixed.filterNotNull()println("result: $result")
# 输出结果mixed: [1, null, 2, null, 3]
result: [1, 2, 3]

三、排序操作

  1. 对元素进行升序排序
val unsorted = listOf(3, 1, 4, 1, 5)println("unsorted: $unsorted")val sorted = unsorted.sorted()println("sorted: $sorted")
# 输出结果unsorted: [3, 1, 4, 1, 5]
sorted: [1, 1, 3, 4, 5]
  1. 对元素进行降序排序
val unsorted = listOf(3, 1, 4, 1, 5)println("unsorted: $unsorted")val sortedDescending = unsorted.sortedDescending()println("sortedDescending: $sortedDescending")
# 输出结果unsorted: [3, 1, 4, 1, 5]
sortedDescending: [5, 4, 3, 1, 1]
  1. 对元素进行自定义升序排序
val values = listOf("aa", "b", "ccc")println("values: $values")val custom = values.sortedBy { it.length }println("custom: $custom")
# 输出结果values: [aa, b, ccc]
custom: [b, aa, ccc]

四、分组操作

  1. 根据条件将元素分组,返回一个 Map,其中,键是分组条件的结果,值是对应的元素列表
val words = listOf("apple", "banana", "orange", "pear")println("words: $words")val byLength = words.groupBy { it.length }println("byLength: $byLength")
# 输出结果words: [apple, banana, orange, pear]
byLength: {5=[apple], 6=[banana, orange], 4=[pear]}
  1. 根据条件将元素分组,分成两个 List,第一个 List 包含满足条件的元素,第二个 List 包含不满足条件的元素
val words = listOf("apple", "banana", "orange", "pear")println("words: $words")val (longWords, shortWords) = words.partition { it.length > 5 }println("longWords: $longWords")
println("shortWords: $shortWords")
# 输出结果words: [apple, banana, orange, pear]
longWords: [banana, orange]
shortWords: [apple, pear]

五、集合操作

  1. 并集:+ 操作符用于合并两个 List 的元素,允许重复

  2. 真并集:union 用于合并两个 List 的元素,返回 Set,自动去重

  3. 交集:intersect 返回两个 List 中都存在的元素,返回 Set

  4. 差集:- 操作符返回 a 有但 b 没有的元素

val a = listOf(1, 2, 3)
val b = listOf(2, 3, 4)val union = a + b
val union2 = a.union(b)
val intersect = a.intersect(b)
val subtract = a - bprintln("union: $union")
println("union2: $union2")
println("intersect: $intersect")
println("subtract: $subtract")
# 输出结果union: [1, 2, 3, 2, 3, 4]
union2: [1, 2, 3, 4]
intersect: [2, 3]
subtract: [1]

六、归纳操作

  1. 对 List 的元素进行累积计算
val numbers = listOf(1, 2, 3, 4)val sum = numbers.reduce { acc, i -> acc + i }println("sum: $sum")
# 输出结果sum: 10
  1. 对 List 的元素进行累积计算,可以自定义初始值
val numbers = listOf(1, 2, 3, 4)val product = numbers.fold(1) { acc, i -> acc + i }println("product: $product")
# 输出结果sum: 11

七、窗口操作

  1. 将 List 划分为多个窗口,每个窗口包含 size 个连续元素
val seq = listOf(1, 2, 3, 4, 5)val pairs = seq.windowed(2)println("pairs: $pairs")
# 输出结果pairs: [[1, 2], [2, 3], [3, 4], [4, 5]]
  1. 将 List 划分为多个窗口,每个窗口包含 size 个连续元素,并对每个窗口应用处理函数并返回结果
val seq = listOf(1, 2, 3, 4, 5)val slidingAvg = seq.windowed(3) { it.average() }println("slidingAvg: $slidingAvg")
# 输出结果slidingAvg: [2.0, 3.0, 4.0]
http://www.dtcms.com/a/298885.html

相关文章:

  • 一款基于react-native harmonyOS 封装的【文档】文件预览查看开源库(基于Harmony 原生文件预览服务进行封装)
  • 【深度之眼机器学习笔记】04-01-决策树简介、熵,04-02-条件熵及计算举例,04-03-信息增益、ID3算法
  • OpenCV图像梯度、边缘检测、轮廓绘制、凸包检测大合集
  • 今天凌晨,字节开源 Coze,如何白嫖?
  • 【Vue2】结合chrome与element-ui的网页端条码打印
  • 使用Spring Boot创建Web项目
  • QT开发---网络编程上
  • 【CTF-WEB-反序列化】利用__toString魔术方法读取flag.php
  • 传统框架与减震楼盖框架地震动力响应分析与有限元模拟
  • USB Type-c
  • 《P3313 [SDOI2014] 旅行》
  • 关于我司即将对商业间谍行为进行法律诉讼的通知
  • C++学习笔记(十:类与对象基础)
  • 洛谷刷题7.25
  • TwinCAT3编程入门1
  • 【Mybatis】分页插件及其原理
  • 蓝桥杯java算法例题
  • powershell 实现批量把文件夹下的bmp文件转换为jpg
  • 操作系统:设计与实现(Operating System Design Implementation)
  • deepseek本地部署,轻松实现编程自由
  • 小架构step系列25:错误码
  • 储粮温度预测新方案!FEBL模型用代码实现:LSTM+注意力+岭回归的完整流程
  • 【map计算】自定义map计算
  • KNN 算法进阶:从基础到优化的深度解析
  • GaussDB 数据库架构师修炼(九) 逻辑备份实操
  • 动态规划Day1学习心得
  • JavaWeb项目(纯Servlet+JSP+前端三大件)入门(从0开始)
  • JavaSE-图书信息管理系统
  • jwt 在net9.0中做身份认证
  • 2507C++,窗口勾挂事件