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

Kotlin集合过滤

过滤操作

在处理集合时,根据特定条件过滤集合或检查集合中是否包含符合特定条件的元素是软件开发中的常见任务。为了解决这个问题,我们可以使用 Kotlin 中实现的函数式 API。

在本主题中,我们将介绍如何使用谓词过滤集合,并获得满足给定谓词的新集合。

过滤

Kotlin 提供了一个函数式 API,它使用扩展函数,允许我们根据谓词过滤集合中的元素。filter() 函数接受一个谓词,并返回一个新的集合,其中包含满足谓词(或条件)的元素。此外,我们还可以使用 filterIndexed(),该函数接受元素的索引和元素本身,并返回一个符合谓词的集合。还有 filterNot(),它返回一个不满足谓词的集合。这些方法适用于所有基本的 Kotlin 集合(列表、集合和映射)。

val isEven: (Int) -> Boolean = { x -> x % 2 == 0 }fun main() {val numbers = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)// 获取偶数列表println(numbers.filter { x -> x % 2 == 0 }) // [0, 2, 4, 6, 8, 10]println(numbers.filter { isEven(it) }) // [0, 2, 4, 6, 8, 10]println(numbers.filter(isEven)) // [0, 2, 4, 6, 8, 10]// 获取奇数列表println(numbers.filter { x -> x % 2 != 0 }) // [1, 3, 5, 7, 9]// 使用 filterNot 获取奇数列表println(numbers.filterNot { x -> x % 2 == 0 }) // [1, 3, 5, 7, 9]// 获取索引大于 3 且为偶数的数字println(numbers.filterIndexed { i, number -> i > 3 && number % 2 == 0 }) // [4, 6, 8, 10]// 获取索引为奇数且以 "k" 开头的单词val words = listOf("peter", "kyle", "robert", "kate", "kevin", "anne", "jeremy")println(words.filterIndexed { i, word -> i % 2 != 0 && word.startsWith("k") }) // [kyle, kate]
}

解释代码

函数式编程中的 filter 函数是一个有效的工具,它可以代替命令式编程中的 forif

fun main() {val numbers = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)val even = numbers.filter { x -> x % 2 == 0 }val odd = mutableListOf<Int>()for (i in numbers) {if (i % 2 != 0) {odd.add(i)}}println(even) // [0, 2, 4, 6, 8, 10]println(odd) // [1, 3, 5, 7, 9]
}

过滤和类型

我们还可以使用一些函数,通过元素的类型来过滤集合。filterIsInstance() 函数根据给定的类型谓词返回一个新的集合,filterNotNull() 函数则返回所有非 null 元素。

  • filterIsInstance 函数不接受一个显式的谓词函数,而是通过类型参数来指定过滤的类型。
fun main() {val elements = listOf(null, 0, "string", 3.14, null, 'c', "Luke")// 只获取字符串元素println(elements.filter { x -> x is String }) // [string, Luke]println(elements.filterIsInstance<String>()) // [string, Luke]// 获取非 null 元素println(elements.filterNot { x -> x == null }) // [0, string, 3.14, c, Luke]println(elements.filterNotNull()) // [0, string, 3.14, c, Luke]// 获取整型元素println(elements.filterIsInstance<Int>()) // [0]
}

分区

partition() 函数将原始集合分为两个部分:一个包含符合谓词的元素,另一个包含不符合谓词的元素。

fun main() {val numbers = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)val (even, odd) = numbers.partition { x -> x % 2 == 0 }println(even) // [0, 2, 4, 6, 8, 10]println(odd) // [1, 3, 5, 7, 9]
}

解释代码

上述代码通过 partition() 函数将数字集合分成了两个部分:一个包含偶数,另一个包含奇数。

结论

在本主题中,我们介绍了根据 条件(即谓词) 过滤集合元素的不同方法。

我们介绍了几种特殊的函数来过滤元素,如 filter()filterIndexed()filterNot()filterIsInstance()filterNotNull()partition()。它们为我们提供了一种优雅且高效的方式来过滤集合元素。

http://www.lryc.cn/news/592069.html

相关文章:

  • 【Python】LEGB作用域 + re模块 + 正则表达式
  • uni-app 跳转页面传参
  • SpringCloud相关总结
  • 牛油果果实检测-目标检测数据集(真实环境下)
  • 基于SpringBoot 投票系统 【源码+LW+PPT+部署】
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 基于jieba实现词频统计
  • 在 React 中根据数值动态设置 SVG 线条粗细
  • Hadoop与云原生集成:弹性扩缩容与OSS存储分离架构深度解析
  • VSCode - VSCode 快速跳转标签页
  • 135. Java 泛型 - 无界通配符
  • Android CountDownTimer
  • Ubuntu系统下交叉编译Android的X265库
  • UVC for USBCamera in Android - 篇二
  • 股指期货的杠杆比例一般是多少?
  • 【软件系统架构】系列七:系统性能——路由器性能深入解析
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - jieba库分词简介及使用
  • 短视频矩阵系统哪家好?全面解析与推荐
  • 短视频矩阵系统:从源头到开发的全面解析
  • 【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形
  • Charles 中文版介绍与使用指南 强大抓包工具助力 API 调试与网络优化
  • 网络编程(modbus,3握4挥)
  • 新书推介 | 吉林大学出版教材《汽车智能辅助驾驶系统技术》,国产仿真工具链GCKontrol-GCAir教学应用
  • mybatisdemo(黑马)
  • S7-1200 Profinet 的诊断功能
  • 嵌入式教育的云端革命:零边界实验室如何重塑未来工程师
  • 硬核电子工程:从硅片到系统的全栈实战指南—— 融合电路理论、嵌入式开发与PCB设计的工程艺术
  • 第三章自定义检视面板_创建自定义编辑器类_检测与应用修改(本章进度(2/9))
  • Xilinx Zynq:一款适用于软件定义无线电的现代片上系统
  • 深度学习之----对抗生成网络-pytorch-CycleGAN-and-pix2pix
  • IP协议深入理解