Как удалить дубликаты объектов с 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, ...) }