Android Kotlin 中的 `groupBy` 方法详解

embedded/2024/9/20 3:53:02/ 标签: android, kotlin, 开发语言

在这里插入图片描述

在 Kotlin 中,groupBy 是一个非常有用的集合操作函数。我们可以使用它按照某个标准,将集合中的元素分组,形成一个 Map,其中 key 是我们分组的标准,value 是符合这个标准的元素列表。本文将通过几个实际例子,来详细说明如何使用 groupBy,并且还会解释一些常见的应用场景。

什么是 groupBy

groupBy 是 Kotlin 标准库中的一个扩展函数,适用于集合、列表、数组等。它接收一个 lambda 表达式,根据这个 lambda 表达式的返回值对集合中的元素进行分组。

语法

kotlin">fun <T, K> Iterable<T>.groupBy(
keySelector: (T) -> K
): Map<K, List<T>>
  • T 表示集合中的元素类型
  • K 表示分组的标准,也就是我们通过 keySelector 函数返回的值
  • 返回值是一个 Map<K, List<T>>,其中 K 是分组标准,List<T> 是符合该标准的元素列表

😄 简单来说,groupBy 就是将集合中的元素按照我们提供的标准进行分组。

基本用法

假设我们有一个员工列表,其中包含每个员工的姓名和年龄。我们想要按照员工的年龄来分组,那么可以这样使用 groupBy

kotlin">data class Employee(val name: String, val age: Int)fun main() {val employees = listOf(Employee("John", 25),Employee("Sarah", 30),Employee("Mike", 25),Employee("Emma", 30),Employee("Chris", 22))val groupedByAge = employees.groupBy { it.age }println(groupedByAge)
}

输出结果

{25=[Employee(name=John, age=25), Employee(name=Mike, age=25)], 
30=[Employee(name=Sarah, age=30), Employee(name=Emma, age=30)], 
22=[Employee(name=Chris, age=22)]}

在这个例子中,我们根据员工的 age 属性进行分组,得到的结果是一个 Map,每个年龄对应一个员工列表。

自定义分组标准

如果我们想根据员工的名字长度来分组,可以通过 groupBy 函数轻松实现:

kotlin">val groupedByNameLength = employees.groupBy { it.name.length }println(groupedByNameLength)

输出结果

{4=[Employee(name=John, age=25), Employee(name=Mike, age=25)], 
5=[Employee(name=Sarah, age=30), Employee(name=Chris, age=22)], 
4=[Employee(name=Emma, age=30)]}

通过这个例子,我们将员工按名字长度进行了分组。

常见应用场景

1. 按条件统计

比如我们有一个产品列表,想按照产品的类型分组统计每种类型的产品数量:

kotlin">data class Product(val name: String, val type: String)val products = listOf(Product("Laptop", "Electronics"),Product("Phone", "Electronics"),Product("Sofa", "Furniture"),Product("Table", "Furniture"),Product("Headphones", "Electronics")
)val groupedByType = products.groupBy { it.type }val countByType = groupedByType.mapValues { it.value.size }println(countByType)

输出结果

{Electronics=3, Furniture=2}

通过这个方式,我们可以轻松统计出每种类型的产品数量。

2. 按属性分类

在某些场景下,我们需要将数据按属性分组,比如按照学生的成绩等级分组:

kotlin">data class Student(val name: String, val score: Int)val students = listOf(Student("Alice", 85),Student("Bob", 70),Student("Charlie", 90),Student("David", 60)
)val groupedByGrade = students.groupBy { when {it.score >= 85 -> "A"it.score >= 70 -> "B"else -> "C"}
}println(groupedByGrade)

输出结果

{A=[Student(name=Alice, score=85), Student(name=Charlie, score=90)], 
B=[Student(name=Bob, score=70)], 
C=[Student(name=David, score=60)]}

通过 when 表达式,我们可以根据学生的分数将他们分为 A、B、C 三个等级。

结论

Kotlin 中的 groupBy 是一个功能强大的工具,可以让我们轻松地按照不同标准对集合中的元素进行分组。无论是按属性分组还是按自定义规则分组,groupBy 都能够提供灵活的解决方案。在实际开发中,它能够帮助我们更高效地处理和组织数据,让代码更加简洁易读。

Best Regards!!


http://www.ppmy.cn/embedded/113331.html

相关文章

使用 Node Media Server 和 FFmpeg 创建直播流,推送本地视频

Node.js安装&#xff1a; 参考这个 Nodejs安装教程 安装完成之后&#xff0c;记得修改一下npm源&#xff1a; npm config set registry https://registry.npmmirror.com下一步&#xff0c;安装node-media-server npm install node-media-server参考这个&#xff1a;安装ffmpe…

vue-cli创建一个可以执行的vue2工程

vue-cli创建一个可以执行的vue2工程 要使用 Vue CLI 创建一个可执行的 Vue 2 工程&#xff0c;请按照以下步骤操作&#xff1a;首先&#xff0c;确保你已经安装了 Node.js 和 npm&#xff08;Node.js 包管理器&#xff09;。安装 Vue CLI。在命令行中运行&#xff1a;创建一个…

Android DPC模式多开 APP

1、修改创建多个profile时超出限制 packages/apps/ManagedProvisioning/src/com/android/managedprovisioning/preprovisioning/PreProvisioningController.java // PO preconditions if (isProfileOwnerProvisioning()) {// If there is already a managed profile, first c…

马匹行为识别系统源码分享

马匹行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

身份证阅读器API模式 VUE Dorado7

VUE 新框架 // 身份证扫描 readIdCard(type) {// 1.连接axios.get(http://localhost:19196/openDevice).then(res > {if (res.data.resultFlag 0) {// 2.读卡axios.get(http://localhost:19196/readCard).then((res) > {if (res.data.resultFlag 0) {// this.$message…

大模型入门3:理解LLAMA

LLama在transformers库中的代码&#xff0c;以及各部分原理Llama3.1技术报告LLama 33b 微调尝试 Model a stack of DecoderBlocks(SelfAttention, FeedForward, and RMSNorm) decoder block 整体结构&#xff1a;最大的区别在pre-norm x -> norm(x) -> attention() -…

图解Redis 02 | String数据类型的原理及应用场景

介绍 在 Redis 中&#xff0c;String 是一种重要的数据类型&#xff0c;是最基本的 key-value 结构&#xff0c;在这个结构中&#xff0c; value 是一个字符串。value 所能容纳的数据最大长度为512M。 需要注意的是&#xff0c;这里的字符串不只指文本数据&#xff0c;它还可…

【Kubernetes】常见面试题汇总(十六)

目录 48.简述 Kubernetes PodsecurityPolicy 机制能实现哪些安全策略&#xff1f; 49.简述 Kubernetes 网络模型&#xff1f; 50.简述 Kubernetes CNl 模型&#xff1f; 48.简述 Kubernetes PodsecurityPolicy 机制能实现哪些安全策略&#xff1f; 在 PodSecurityPolicy 对象…

LSTM文本预测(Pytorch版)

任务&#xff1a;基于 flare 文本数据&#xff0c;建立 LSTM 模型&#xff0c;预测序列文字 1.完成数据预处理&#xff0c;将文字序列数据转化为可用于LSTM输入的数据 2.查看文字数据预处理后的数据结构&#xff0c;并进行数据分离操作 3.针对字符串输入&#xff08;" fla…

【基于C++的产品入库管理系统】

基于C的产品入库管理系统可以用来跟踪产品的入库、出库和库存情况。这种系统通常包括产品信息的录入、查询、更新以及库存管理等功能。下面是一个简化的产品入库管理系统的设计方案及其代码示例。 系统设计概览 产品管理&#xff1a;包括产品的基本信息&#xff08;如名称、规…

个人电脑可以当服务器用吗?

服务器和普通电脑的主要区别体现在以下几个方面&#xff1a; 1.CPU处理性能 服务器的CPU配置通常是多核的&#xff0c;普通电脑的CPU往往只包含单个核心&#xff0c;因此在数据处理能力上远远不如服务器。 2.安全性能 服务器具备更高的可靠性、安全性、容错能力和安全保护能…

【计算机网络 - 基础问题】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

JVM垃圾回收算法

JVM垃圾回收算法是Java虚拟机中自动管理内存的关键机制&#xff0c;它通过智能识别和回收无用对象&#xff0c;有效防止内存泄露&#xff0c;提升系统性能&#xff0c;是Java语言高效、稳定运行的基石。让我们一同探索这一神奇算法&#xff0c;感受它如何为Java世界注入活力&am…

程序化自动交易,合约量化交易软件用哪个比较好

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

面试真题-TCP的三次握手

TCP的基础知识 TCP头部 面试题&#xff1a;TCP的头部是多大&#xff1f; TCP&#xff08;传输控制协议&#xff09;的头部通常是固定的20个字节长&#xff0c;但是根据TCP选项&#xff08;Options&#xff09;的不同&#xff0c;这个长度可以扩展。TCP头部包含了许多关键的字…

力扣100题——贪心算法

概述 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在解决问题时&#xff0c;按照某种标准在每一步都选择当前最优解&#xff08;局部最优解&#xff09;的算法。它期望通过一系列局部最优解的选择&#xff0c;最终能够得到全局最优解。 贪心算法的核心思想 贪心算…

Nginx实用篇:实现负载均衡、限流与动静分离

Nginx实用篇&#xff1a;实现负载均衡、限流与动静分离 | 原创作者/编辑&#xff1a;凯哥Java | 分类&#xff1a;Nginx学习系列教程 Nginx 作为一款高性能的 HTTP 服务器及反向代理解决方案&#xff0c;在互联网架构中扮演着至关重要的角色。它…

如何搭建一个ip池用来做数据抓取用

在当今的数据驱动时代&#xff0c;数据抓取成为了获取网络信息的重要手段。然而&#xff0c;频繁的数据抓取活动可能会触发网站的安全机制&#xff0c;导致IP被封禁。为了维持数据抓取的持续性和稳定性&#xff0c;构建一个有效的IP池变得至关重要。本文将详细介绍如何搭建一个…

好用的XML解析库——fast-xml-parser

有时候需要在前台用到xml的解析&#xff0c;并且可能需要解析后再重新生成xml字符串&#xff0c;这个时候就可以用到fast-xml-parser了。 优点 使用简单&#xff0c;主要有两个对象&#xff0c;分别是XMLParser和XMLBuilder。 主要需要关注的属性有 ignoreAttributes 和 supp…

ASR(自动语音识别)识别文本效果的打分总结

ASR(自动语音识别)识别文本效果的打分总结 1. 词错误率(WER, Word Error Rate)2. 字正确率(W.Corr, Word Correct)3. 编辑距离(Edit Distance)4. 特定错误率5. 句子错误率(SER, Sentence Error Rate)6. 基于模型的评估方法对于ASR(自动语音识别)识别文本效果的打分…