我有一个map<String, MyObject>,其中映射中的值对于某些变量可能具有相同的值(例如,在我的示例中为name参数).我将感谢任何使用STREAMS删除值上具有相同name参数的条目的解决方案,并只保留其中一个具有最小id参数的条目.

data class MyObject(val id: Int, val name: String)

例如,我的 map 可以是:

[
"first" to MyObject(1, "Alice"),
"second" to MyObject(2, "Bob"),
"third" to MyObject(3, "Alice")
]

预期输出为:

[
"first" to MyObject(1, "Alice"),
"second" to MyObject(2, "Bob")
]

其中删除具有键third的条目,因为该值具有与第一条目相同的name.

推荐答案

首先,我们需要识别所有重复的候选人.我们可以用groupBy做到这一点,它适用于任何迭代器(Map是迭代器类型Entry<K, V>的可迭代器).

myMap.entries
     .groupBy({ entry => entry.value.name })

这会产生一个类型为Map<String, List<Entry<String, MyObject>>>的值.

现在,对于映射中的每个值,我们希望 Select 列表中ID最小的元素.我们可以通过使用minBy的某个条件 Select 最小的元素,并可以对具有mapValues的映射中的每个元素执行此操作.

myMap.entries
     .groupBy({ entry => entry.value.name })
     .mapValues({ entry => entry.value.minBy({ it.value.id })!! })

(注意:groupBy总是生成非空列表,因为它正在划分一个集合,所以我们可以自信地断言!!存在最小值)

最后,这将返回Map<String, Entry<String, MyObject>>,您可能希望消除多余的Map层.

myMap.entries
     .groupBy({ entry -> entry.value.name })
     .mapValues({ entry -> entry.value.minBy({ it.value.id })!! })
     .values
     .associate({ it.key to it.value })

Try it online!

Kotlin相关问答推荐

Kotlin中的增广赋值语句中的难以理解的错误

Kotlin多平台(KMP)保存到文件不能在iOS上保存

Java/Kotlin中类似Rust般的注释编译?

Kotlin .如何用从 1 到 90 的 5 个唯一数字填充列表中的每一行?

为什么记得不将 StateFlow 转换为特定类型?

返回 kotlin 中的标签和 lambda 表达式

JetPack Compose:添加点击持续时间

如何在 Kotlin 中为变量分配另一个变量的值?

如何在 Kotlin 中实现 Composition UML 关系?

如何从 kotlin 中的数据类访问 val?

使用 Kotlin 协程时 Room dao 类出错

在 APK META-INF/library_release.kotlin_module 中复制的重复文件

Saripaar formvalidation 在 kotlin 中第二次不起作用

Spring webflux bean验证不起作用

参考 Kotlin 中的 Java 接口静态字段

在用Kotlin编写的Android库公共API中处理R8+JvmStatic Annotation+Lambda

如何使用kotlin中的反射查找包中的所有类

项目未与 Gradle 链接

Kotlin扩展函数与成员函数?

将 androidx.constraintlayout:constraintlayout lib 更新到 2.0.2 版本后出现崩溃 isRtl () null 引用