在 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 中 Java String[] 的等价物
发布时间:2023/05/13 浏览次数:94 分类:Java
-
本文介绍了 Kotlin 中 Java String[] 的等价物。 我们将看到所有可能的方法来为 Kotlin 实现与 Java 中的 String[] 相同的结果。
将 Java 文件代码转换为 Kotlin
发布时间:2023/05/13 浏览次数:987 分类:Java
-
Kotlin 现在是一种官方的 Android 语言。 因此,您可能希望将 Java 文件更改为 Kotlin。 本文教您如何将 Java 转换为 Kotlin。
在 Kotlin 中使用 forEach
发布时间:2023/05/13 浏览次数:362 分类:Java
-
本文介绍 Kotlin 中 forEach 关键字的概念和使用。 我们将看到一些使用 Kotlin forEach 循环的示例来理解它。
在 Kotlin 中使用 reified 关键字
发布时间:2023/05/13 浏览次数:266 分类:Java
-
reified 关键字是在 Kotlin 中使用泛型时最常使用的编程概念。在本教程中,我们将学习如何使用两种方法解决此问题,包括将类型的类作为泛型函数的参数传递,以及将 reified 关键字与内联函数
Kotlin 中 ! 和 ? 运算符之间的区别
发布时间:2023/05/13 浏览次数:212 分类:Java
-
在 Kotlin 中,断言运算符 !! 和安全调用符 ? 使用 Null 安全。本文介绍空安全的概念。 我们也将通过如何! 和 ? 在 Kotlin 中有助于空安全。
Kotlin 中 is 运算符 与 as 运算符之间的区别
发布时间:2023/05/13 浏览次数:183 分类:Java
-
这篇文章讨论了 Kotlin 中 is 和 as 运算符之间的区别。 我们还将介绍如何以及何时使用每一个。
Android Studio 中的 Kotlin 打印到控制台
发布时间:2023/05/13 浏览次数:312 分类:Java
-
Kotlin 的 logcat 窗口可以实时显示输出,让开发人员能够高效地处理他们的代码。 今天,我们将完成将消息打印到 Kotlin 控制台的步骤。
在 Kotlin 中获取随机数
发布时间:2023/05/13 浏览次数:365 分类:Java
-
随机数是使用一种算法从一组数字中生成的,该算法可确保每个数字的生成概率相等。在Kotlin中使用IntRange的random()扩展函数
在 Kotlin 中使用内联函数
发布时间:2023/05/13 浏览次数:223 分类:Java
-
Kotlin 允许使用内联函数有效地处理更高级的函数。 在本文中,我们将介绍我们需要了解的有关 Kotlin 中的内联函数的所有信息。