我有一个字符串列表,我想转换为一个出现映射。( ~ 映射值是字符串在列表中重复的次数(
命令式方式,我会像下面这样写
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)