Kotlin FP:将 List<String> 转换为 Map<String,Int>

Ray*_*non 1 functional-programming kotlin

我有一个字符串列表,我想转换成一个出现的地图。( ~ Map 值是 String 在 List 中重复的次数)

命令式的方式,我会写如下

fun transformMap(list: List<String>): Map<String, Int> {
    val map = mutableMapOf<String,Int>()
    for(n in list){
        map.put(n,map.getOrDefault(n,0) + 1)
    }
    return map.toMap()
}
Run Code Online (Sandbox Code Playgroud)

如何用函数式编程的方式写这个?

在 Java 8+ 中,这将是这样写的

String[] note;
Map<String, Integer> noteMap = Arrays.stream(note)
         .collect(groupingBy(Function.identity(),
          collectingAndThen(counting(), Long::intValue)));
Run Code Online (Sandbox Code Playgroud)

Tod*_*odd 6

您可以Grouping通过Iterable<T>.groupingBy扩展使用 Kotlin在一行中完成此操作:

val myList = listOf("a", "b", "c", "a", "b", "a")
val myMap = myList.groupingBy { it }.eachCount()

println(myMap)
// Prints {a=3, b=2, c=1}
Run Code Online (Sandbox Code Playgroud)