Значение группы Kotlin, установленное вместо списка - PullRequest
1 голос
/ 16 марта 2019

Я собираюсь сгруппировать Set<Pair<String,Int>> значения в Map<String, Set<Int>> так просто. Найти все соответствующие целые для строки и создать набор. У меня есть решение, которое работает:


setStringInt.stream()
            .collect(
                groupingBy(
                    Projection::stringObj,
                    mapping(Projection::intObj,
                        toSet<Int>())
                )
            )

У меня есть уборщик:

            .groupBy { it.stringobj }
            .mapValues { it.value.map { it.intobj }.toSet() }

Но это выглядит довольно грязно. У вас есть идеи, как это упростить? Могу ли я сделать это без использования потока?

Ответы [ 2 ]

5 голосов
/ 16 марта 2019

Вы можете просто использовать функции Kotlin groupBy, а затем mapValues непосредственно на Set.

Сначала вы используете groupBy на it.first, чтобы получить Map<String, List<Pair<String, Int>>.Затем вам нужно отобразить значения полученной карты, чтобы вы получили List<Int> от List<Pair<String, Int>>.Как это:

setStringInt.groupBy { it.first }
            .mapValues { entry -> entry.value.map { it.second }.toSet() }
1 голос
/ 16 марта 2019

Я думаю, что это более читабельно:

setStringInt.groupBy({ it.first }, { it.second }).mapValues { it.value.toSet() }

с использованием перегрузки

inline fun <T, K, V> Iterable<T>.groupBy(
    keySelector: (T) -> K,
    valueTransform: (T) -> V
): Map<K, List<V>>

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...