在 Kotlin 中将列表转换为 Map
Kotlin 提供了不同的集合; 最常见的包括 List、Map 和 Set。 在开发应用程序时,有些情况下我们需要将一种类型的集合转换为另一种类型以实现特定目标。
例如,您可能有一个包含重复元素的列表,而我们知道集合不允许有重复元素。 我们可以将列表转换为集合,无需编写任何逻辑即可删除重复项。
Kotlin 允许我们通过提供不同的方法来执行这些操作,我们可以在集合上使用这些方法将集合转换为不同类型的集合。
在本篇文章中,我们将学习将 List 数据结构转换为 Map 数据结构的不同方法。
创建一个 Kotlin 项目
打开 IntelliJ 并选择新建 > 文件 > 项目。 在打开的窗口中,输入项目名称 list-to-map,在 Language 部分选择 Kotlin,在 Build System 部分选择 IntelliJ。
最后,按 Create 按钮生成一个 Kotlin 项目。 在kotlin文件夹下新建一个Main.kt文件,将以下代码复制粘贴到文件中。
data class Employee(val id: Number,
val firstName: String,
val email: String);
fun fetchEmployees(): List<Employee> {
return listOf(
Employee(1,"john", "john@gmail.com"),
Employee(2,"mary","mary@gmail.com"),
Employee(3,"jane","jane@gmail.com"),
Employee(3,"abdul","abdul@gmail.com")
);
}
在这个例子中,我们创建了一个名为 Employee 的数据类,它帮助我们在 fetchEmployees()
方法中创建一个员工列表 List<Employee>
。
我们将在本教程中涵盖的所有示例中使用 fetchEmployees()
方法。
在 Kotlin 中使用 associate() 方法将 List 转换为 Map
将以下代码复制并粘贴到 Main.kt 文件中的 fetchEmployees()
函数之后。
fun usingAssociate(employees: List<Employee>): Map<Number, String> {
return employees.associate { employee ->
Pair(employee.id, employee.email)
}
}
fun main(){
println(usingAssociate(fetchEmployees()));
}
在此示例中,我们已将我们的列表转换为包含 employee.id 作为键和 employee.email 作为字符串 Map<Number, String> 的映射。 请注意,我们的地图的插入顺序与列表中的顺序保持一致。
associate()
方法是 Iterable 接口的扩展函数,它在列表元素上使用转换函数来创建一个对并将该对作为映射返回。
请注意
,我们明确提供了我们想要返回的值作为创建的对中的键和值。 如果一对密钥重复,则旧对将替换为新对。
例如,我们的列表中有两个对象的 ID 均为 3,第一个是 jane,第二个是 abdul。 当元素被插入到地图中时,jane 将被 abdul 替换。
运行上面的代码并确保输出如下所示:
{1=john@gmail.com, 2=mary@gmail.com, 3=abdul@gmail.com}
在 Kotlin 中使用 associateBy() 方法将 List 转换为 Map
把前面的例子注释掉,把下面的代码复制粘贴到Main.kt文件注释后。
fun usingAssociateBy(employees: List<Employee>): Map<Number, Employee> {
return employees.associateBy { employee: Employee ->
employee.id
}
}
fun main(){
println(usingAssociateBy(fetchEmployees()));
}
在此示例中,我们已将列表转换为包含 employee.id 作为键的 Map,并且 employee 对象的值为 Map<Number, Employee>
。
associateBy()
方法也是 Iterable 接口的扩展函数。 我们只需要传递在地图中用作键的值。
keySelector 函数从列表中的每个对象获取此键并将其应用于地图。 地图的值成为我们列表中的对象。
请注意
,keySelector 函数将检索两个值为 3 的重复项,正如我们在上面看到的那样。 旧元素将被新元素替换。
运行此代码并确保输出如下所示:
{1=Employee(id=1, firstName=john, email=john@gmail.com),
2=Employee(id=2, firstName=mary, email=mary@gmail.com),
3=Employee(id=3, firstName=abdul, email=abdul@gmail.com)}
在 Kotlin 中使用 associateWith() 方法将 List 转换为 Map
把前面的例子注释掉,把下面的代码复制粘贴到Main.kt文件注释后。
fun usingAssociateWith(employees: List<Employee>): Map<Employee, Number> {
return employees.associateWith { employee ->
employee.id
}
}
fun main(){
println(usingAssociateWith(fetchEmployees()));
}
在此示例中,我们已将一个列表转换为一个映射,其中包含 employee 对象作为键,employee.id 作为值 Map<Employee, Number>
。
associateWith()
方法是 Iterable 接口的扩展函数,我们只需要传递将用作地图值的元素即可。 valueSelector 函数从我们列表中的每个对象获取值并将它们应用于我们的地图。
地图的键成为我们列表中的元素。 由于对象是映射中的键,因此不会有重复项,但映射中的两个元素的值为 3。
运行此代码并确保输出如下所示:
{Employee(id=1, firstName=john, email=john@gmail.com)=1,
Employee(id=2, firstName=mary, email=mary@gmail.com)=2,
Employee(id=3, firstName=jane, email=jane@gmail.com)=3,
Employee(id=3, firstName=abdul, email=abdul@gmail.com)=3}
在 Kotlin 中使用 groupBy() 方法将列表转换为地图
将前面的例子注释掉,将下面的代码复制粘贴到Main.kt文件注释后。
fun usingGroupBy(employees: List<Employee>): Map<Number, List<Employee>> {
return employees.groupBy { employee: Employee ->
employee.id
}
}
fun main(){
println(usingGroupBy(fetchEmployees()));
}
在我们的第一个示例中,我们已经看到在将列表转换为地图时任何重复项都会被替换。 在您想要维护重复项的情况下,我们使用 groupBy() 方法。
在这个例子中,我们将一个列表转换为一个映射,其中包含作为 employee.id 的键,值是按 id Map<Number, List<Employee>>
分组的员工对象列表。
groupBy()
方法也是 Iterable 接口的扩展函数,只需要我们传递用作映射中键的值。 此方法的 keySelector 函数从列表中的每个对象获取键并将其应用于我们的地图。
具有相同 id 的对象被分组在一个列表中。 运行此代码并确保输出如下所示。
{1=[Employee(id=1, firstName=john, email=john@gmail.com)],
2=[Employee(id=2, firstName=mary, email=mary@gmail.com)],
3=[Employee(id=3, firstName=jane, email=jane@gmail.com),
Employee(id=3, firstName=abdul, email=abdul@gmail.com)]}
总结
在本篇文章中,我们学习了如何利用 Iterable 接口的不同扩展函数将列表转换为地图。 我们介绍的方法包括使用 associate()
方法、associateBy()
方法、associateWith()
方法和 groupBy()
方法。
请注意
,您还可以使用其他分组策略,例如groupingBy()
和groupByTo()
。
相关文章
在 Kotlin 中继承具有多个构造函数的类
发布时间:2023/05/12 浏览次数:200 分类:Java
-
本文讨论如何扩展具有多个构造函数的类。 构造函数是在创建对象时调用的函数,用于初始化类变量。在 Kotlin 中扩展具有多个构造函数的类
Kotlin中栈数据结构的使用
发布时间:2023/05/12 浏览次数:130 分类:Java
-
本篇文章我们就来学习一下Kotlin中栈的使用。 我们还将看到用于更新和更改 Kotlin 堆栈的标准函数,包括 push、pop、peek、search 和 isEmpty。我们还将研究比 Kotlin 中的堆栈更好的替代方案。
Kotlin中findViewById函数的使用
发布时间:2023/05/12 浏览次数:183 分类:Java
-
Kotlin 中的 findViewById 允许在 ID 的帮助下查看和更新视图。 本文介绍了 Kotlin 中 findViewById 函数的使用。
Kotlin runBlocking:用协程代码桥接非协程世界
发布时间:2023/05/12 浏览次数:194 分类:Java
-
Kotlin runBlocking 函数允许阻塞整个线程。 我们将在本文中看到更多关于 Kotlin Coroutine runBlocking 的信息。
Kotlin Init 和构造函数之间的区别
发布时间:2023/05/12 浏览次数:67 分类:Java
-
构造函数和 Kotlin init 块是这种编程语言的重要组成部分。 本文概述了 init 和构造函数之间的区别。
在 Kotlin 中获取 SimpleName
发布时间:2023/05/12 浏览次数:154 分类:Java
-
本文介绍了在 Kotlin 中获取类的 SimpleName 的简单方法。 它显示了与 Java 的 getSimpleName() 方法等效的方法。
在 Kotlin 中将字符串拆分为数组
发布时间:2023/05/12 浏览次数:111 分类:Java
-
本教程将展示如何在 Kotlin 中将字符串拆分为字符串数组。 如上所述,您可以使用此技术通过从字符串数组中检索关键字来在应用程序中进行搜索。