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