Kotlin FP : 将列表转换为<String>映射<字符串,整数>



我有一个字符串列表,我想转换为一个出现映射。( ~ 映射值是字符串在列表中重复的次数(

命令式方式,我会像下面这样写

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()
}

如何以函数式编程的方式编写?

在Java 8+中,这将这样写

String[] note;
Map<String, Integer> noteMap = Arrays.stream(note)
         .collect(groupingBy(Function.identity(),
          collectingAndThen(counting(), Long::intValue)));
您可以使用

Kotlin 的Grouping通过 Iterable<T>.groupingBy 扩展在一行中执行此操作:

val myList = listOf("a", "b", "c", "a", "b", "a")
val myMap = myList.groupingBy { it }.eachCount()
println(myMap)
// Prints {a=3, b=2, c=1}

您也可以在 Kotlin 中使用流。但是如果你想避免流,你可以使用 fold()

val list = listOf("a", "b", "c", "a")
val histogram = list.fold(mutableMapOf<String, Int>()) { map, s ->
    map[s] = map.getOrDefault(s, 0) + 1
    map
}.toMap()
println(histogram)

最新更新