Kotlin groupby设置为值而不是列表

时间:2019-03-16 10:26:24

标签: kotlin

我将简单地将foreach值分组为Set<Pair<String,Int>>。查找字符串的所有匹配整数并创建集合。我有可行的解决方案:

Map<String, Set<Int>>

我有一种清洁工:


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

但是看起来很脏。你有什么想法可以简化吗?我无需使用流就可以做到这一点吗?

2 个答案:

答案 0 :(得分:5)

您可以只使用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 :(得分:1)

我认为这更具可读性:

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>>

超载。