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

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

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

如果我们将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) }
            )
        )
}

是否有一位行为类似的 Kotlin 收藏家?

最佳答案

在这种情况下,计算char的最简单方法是:

val charsMap = s.groupingBy { it }.eachCount()

更加常见的是,groupingBy是一个功能强大的工具,可以替代toMap收集器。

08-05 18:14