如何从Kotlin中的列表中删除distinctBy的重复对象?

如何在自定义对象列表上使用distinctBy来去除重复项? 我想通过对象的多个属性来确定“唯一性”,但不是全部。

我希望像这样的事情会起作用,但没有运气:

val uniqueObjects = myObjectList.distinctBy { it.myField, it.myOtherField }

编辑:我很好奇如何使用distinctBy与任何数量的属性,不只是像我上面的例子中的两个。

2 Solutions collect form web for “如何从Kotlin中的列表中删除distinctBy的重复对象?”

你可以创建一对:

 myObjectList.distinctBy { Pair(it.myField, it.myOtherField) } 

distinctBy将使用Pair相等性来确定唯一性。

如果你看一下distinctBy的实现,它只是将你在lambda中传递的值添加到Set 。 如果Set没有包含指定的元素,则将原始List的相应项添加到新List并且作为distinctBy的结果返回新List

 public inline fun <T, K> Iterable<T>.distinctBy(selector: (T) -> K): List<T> { val set = HashSet<K>() val list = ArrayList<T>() for (e in this) { val key = selector(e) if (set.add(key)) list.add(e) } return list } 

所以你可以传递一个复合对象来保存你需要的属性来找到唯一性。

 data class Selector(val property1: String, val property2: String, ...) 

并在lambda中传递该Selector对象:

 myObjectList.distinctBy { Selector(it.property1, it.property2, ...) } 
  • 如何为Kotlin和Gradle设置“sourceCompatibility”?
  • Kotlin和Android lint检查
  • 文件类的注释
  • Intellij IDEA插件开发。 行动“创建kotlin类”
  • 使用java lambda调用kotlin函数时,Kotlin无法访问kotlin.jvm.functions.Function1
  • var name:String有什么区别? 和var name:String
  • Kotlin扩展冲突
  • 如何将kotlin源文件转换为java源文件
  • 在ConstraintLayout中使用组来侦听多个视图上的点击事件
  • Kotlin可为空的variables赋值
  • 无法使用Kotlin在我的Android应用程序中为全局variables创建一个类
  • Kotlin language will be the best programming language for Android.