我将简单地将foreach
值分组为Set<Pair<String,Int>>
。查找字符串的所有匹配整数并创建集合。我有可行的解决方案:
Map<String, Set<Int>>
我有一种清洁工:
setStringInt.stream()
.collect(
groupingBy(
Projection::stringObj,
mapping(Projection::intObj,
toSet<Int>())
)
)
但是看起来很脏。你有什么想法可以简化吗?我无需使用流就可以做到这一点吗?
答案 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>>
超载。