Как удалить дубликаты объектов с distinctBy из списка в Kotlin?
как я могу использовать distinctBy в списке пользовательских объектов для удаления дубликатов? Я хочу определить "уникальность" по нескольким свойствам объекта, но не по всем из них.
Я надеялся, что что-то подобное сработает, но не повезло:
val uniqueObjects = myObjectList.distinctBy { it.myField, it.myOtherField }
Edit: мне интересно, как использовать distinctBy с любым количеством свойств, а не два, как в моем примере выше.
2 ответов
вы можете создать пару:
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, ...) }