具有重复键的 Kotlin toMap 收集器

fbo*_*kov 5 java kotlin java-stream

我正在寻找带有参数的KotlinJava 流收集器的类似物。Collectors.toMapmergeFunction

例如,在 Java 中为了计算 String 中的字符数,可以使用以下代码片段:

Map<Character, Integer> charsMap = s2.chars()
            .mapToObj(c -> (char) c)
            .collect(Collectors.toMap(Function.identity(), s -> 1, Integer::sum));
Run Code Online (Sandbox Code Playgroud)

如果我们将 Java 代码片段转换为 Kotlin,由于显式类型的使用,它看起来相当难看。

private fun countCharsV2(word: String): Map<Char, Int> {
    return word.chars()
        .mapToObj { it.toChar() }
        .collect(
            Collectors.toMap(
                Function.identity(),
                Function { 1 },
                BinaryOperator { a: Int, b: Int -> Integer.sum(a, b) }
            )
        )
}
Run Code Online (Sandbox Code Playgroud)

有类似行为的 Kotlin 收集器吗?

fbo*_*kov 1

在这种特殊情况下,计算字符数的最简单方法是:

val charsMap = s.groupingBy { it }.eachCount()
Run Code Online (Sandbox Code Playgroud)

更一般地说,时尚groupingBy是一个强大的工具,可以替代toMap收集器。