Как удалить дубликаты объектов с помощью clearBy из списка в Kotlin?

Как я могу использовать distinctBy в списке пользовательских объектов, чтобы вырезать дубликаты? Я хочу определить «уникальность» несколькими свойствами объекта, но не все из них.

Я надеялся, что это сработает, но не повезло:

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

Изменить: Мне любопытно, как использовать distinctBy с любым количеством свойств, а не только двумя, как в моем примере выше.

Вы можете создать пару:

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

distinctBy будет использовать равенство Pair для определения уникальности.

Если вы посмотрите на реализацию distinctBy , он просто добавит значение, которое вы передаете в лямбда, в Set . И если в Set еще не указан указанный элемент, он добавляет соответствующий элемент исходного List в новый List и возвращается новый List в результате distinctBy .

 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, ...) 

И передайте этот объект Selector внутри лямбда:

 myObjectList.distinctBy { Selector(it.property1, it.property2, ...) }