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

Kotlin聚合方法

在前面的主题中,我们学习了如何对集合进行排序或基于谓词过滤集合元素。

现在是时候学习如何根据集合的内容获取值了,例如:最大值、平均值、具有最大某个属性值的对象等等。Kotlin 提供了非常方便的方法来完成这些任务,这些方法被称为“聚合方法(aggregation methods)”。


基本聚合函数

当我们处理集合时,可以使用一系列方法根据集合的内容获取某些值或额外信息,这些方法包括:

  • minOrNull():返回集合中最小的元素,若集合为空则返回 null

  • maxOrNull():返回集合中最大的元素,若集合为空则返回 null

  • average():返回数值集合的平均值。

  • sum():返回数值集合所有元素的总和。

  • count():返回集合中的元素数量。

fun main() {val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)// 最小值和最大值println(numbers.minOrNull()) // 1println(numbers.maxOrNull()) // 10// 平均值println(numbers.average()) // 5.5// 总和println(numbers.sum()) // 55// 元素数量println(numbers.count()) // 10
}
解释代码:

这个程序使用了基础的聚合方法来处理一个整数列表。你可以轻松获得最大值、最小值、平均数、总和和元素数量。


带选择器函数的聚合

有时候我们需要指定使用哪个属性进行聚合操作。Kotlin 提供了**带选择器函数(selector function)**的专用方法:

  • minByOrNull { }:返回具有最小属性值的元素(集合为空时返回 null)。

  • maxByOrNull { }:返回具有最大属性值的元素(集合为空时返回 null)。

  • minOfOrNull { }:返回所有选择器函数结果中的最小值(集合为空时返回 null)。

  • maxOfOrNull { }:返回所有选择器函数结果中的最大值(集合为空时返回 null)。

  • sumOf { }:返回将选择器函数应用于每个元素后的结果之和。

fun main() {val words = listOf("anne", "michael", "caroline", "dimitry", "emilio")// 元素个数println(words.count()) // 5// 根据长度选择最大/最小的字符串println(words.maxByOrNull { it.length }) // carolineprintln(words.minByOrNull { it.length }) // anne// 最大/最小长度值println(words.maxOfOrNull { it.length }) // 8println(words.minOfOrNull { it.length }) // 4// 所有单词长度之和println(words.sumOf { it.length }) // 32// 使用谓词进行计数和查找println(words.count { it.length > 5 }) // 4println(words.maxByOrNull { it.length > 5 }) // michaelprintln(words.minByOrNull { it.length > 5 }) // anne// 空集合val emptyWordsList = emptyList<String>()println(emptyWordsList.count()) // 0println(emptyWordsList.maxByOrNull { it.length }) // nullprintln(emptyWordsList.minByOrNull { it.length }) // nullprintln(emptyWordsList.maxOfOrNull { it.length }) // nullprintln(emptyWordsList.minOfOrNull { it.length }) // nullprintln(emptyWordsList.maxOf { it.length })  // 抛出 NoSuchElementExceptionprintln(emptyWordsList.minOf { it.length })  // 抛出 NoSuchElementExceptionprintln(emptyWordsList.maxBy { it.length })  // 抛出 NoSuchElementExceptionprintln(emptyWordsList.minBy { it.length })  // 抛出 NoSuchElementException
}
解释代码:
  • maxByOrNullminByOrNull 会返回属性值最大的元素,而不是值本身。

  • maxOfOrNullminOfOrNull 返回的是选择器结果的最大/最小值。

  • 使用谓词如 it.length > 5 会将 true/false 当作比较依据,true > false,所以 maxByOrNull 返回第一个满足条件的元素。


使用比较器聚合(Comparator)

你也可以通过传递自定义比较器来执行类似操作:

  • minWithOrNull(comparator)

  • maxWithOrNull(comparator)

  • minOfWithOrNull(comparator) { }

  • maxOfWithOrNull(comparator) { }

这些方法在集合为空时返回 null,而它们的非 OrNull 版本(如 maxWith())在集合为空时会抛出异常。

fun main() {val words = listOf("anne", "michael", "caroline", "dimitry", "emilio")// 自定义比较器:长度排序println(words.maxWithOrNull(compareBy { it.length })) // carolineprintln(words.minWithOrNull(compareBy { it.length })) // anne// 使用比较器获取最大最小的长度值println(words.maxOfWithOrNull(naturalOrder()) { it.length }) // 8println(words.minOfWithOrNull(naturalOrder()) { it.length }) // 4// 使用谓词计数println(words.count { it.first() == 'a' }) // 1
}

反转排序结果

你可以将比较器与 reversed() 组合,获取相反顺序的结果:

fun main() {val words = listOf("peter", "anne", "michael", "caroline")// 按长度排序后反转println(words.sortedWith(compareBy { it.length }).reversed()) // [caroline, michael, peter, anne]// 按中间字母排序后反转println(words.sortedWith(compareBy { it[it.length / 2] }).reversed()) // [peter, anne, caroline, michael]
}
解释代码:
  • compareBy { it.length } 是一个比较器,会按单词长度排序。

  • reversed() 会将排序结果倒序。

  • it[it.length / 2] 是获取字符串的中间字符,根据它来排序也可以。


总结

在本节中,我们学习了各种用于获取集合中值的聚合方法,包括:

  • 获取最大/最小值。

  • 获取平均值、总和。

  • 查找具有最大某个属性值的元素。

  • 使用选择器或比较器自定义排序和聚合方式。


文章转载自:
http://caduceus.kjawz.cn
http://bombe.kjawz.cn
http://antifoulant.kjawz.cn
http://armature.kjawz.cn
http://antrustion.kjawz.cn
http://backlash.kjawz.cn
http://characterize.kjawz.cn
http://acquisition.kjawz.cn
http://calyculus.kjawz.cn
http://chlorid.kjawz.cn
http://barratrous.kjawz.cn
http://bren.kjawz.cn
http://ankyloglossia.kjawz.cn
http://adenomatous.kjawz.cn
http://allopatric.kjawz.cn
http://chlorobenzene.kjawz.cn
http://anthracnose.kjawz.cn
http://camphorate.kjawz.cn
http://asperate.kjawz.cn
http://calligraphy.kjawz.cn
http://advisability.kjawz.cn
http://bidder.kjawz.cn
http://calicoback.kjawz.cn
http://atheistic.kjawz.cn
http://amvets.kjawz.cn
http://beldame.kjawz.cn
http://camper.kjawz.cn
http://bes.kjawz.cn
http://bonds.kjawz.cn
http://centrobaric.kjawz.cn
http://www.dtcms.com/a/280319.html

相关文章:

  • Python 操作Excel工作表:添加、删除、移动、隐藏
  • 前端安全指南:防御XSS与CSRF攻击
  • 给 Excel 整列空格文字内容加上前缀:像给文字穿衣服一样简单!
  • Excel制作玫瑰图
  • PostgreSQL FATAL: sorry, too many clients already 连接数爆满的处理办法
  • excel 通过openpyxl表格下载和插入图片
  • 京东平台商品评论接口接入指南与代码实现
  • 国内大模型技术与应用综述
  • 区块链:以太坊侧链Polygon
  • 日常运维问题汇总-59
  • STL的一些知识点
  • C/C++宏定义中do{}while(0)的妙用
  • CAS单点登录架构详解
  • 弗兰肯斯坦式的人工智能与GTM策略的崩溃
  • (LeetCode 每日一题) 3136. 有效单词 (字符串)
  • 【牛客LeetCode数据结构】单链表的应用——移除链表元素问题、链表分割问题详解
  • 从零构建鸿蒙应用:深度解析应用架构与项目结构
  • MIPI DSI(五) DBI 和 DPI 格式
  • 3.2数据库-关系代数-函数依赖-范式
  • Pitaya 是一个简单、快速、轻量级的游戏服务器框架,它为分布式多人游戏和服务器端应用程序提供了一个基本的开发框架
  • java的BO VO PO DO等对象的统称
  • 【Numba】正确使用numba,让你的python代码原地起飞!
  • 【转】Rust: PhantomData,#may_dangle和Drop Check 真真假假
  • 022_提示缓存与性能优化
  • 程序“夯住“的常见原因
  • 在物联网系统中时序数据库和关系型数据库如何使用?
  • 深入掌握Python正则表达式:re库全面指南与实战应用
  • .NET 10 Preview 1发布
  • OpenCV多尺度图像增强算法函数BIMEF()
  • 算法第23天|贪心算法:基础理论、分发饼干、摆动序列、最大子序和