Kotlin / Java在地图中收集地图的功能和不变方法
作者:互联网
目前,我正在通过Java API读取文件,并通过foreach方法将某些项目添加到地图中,这迫使我不得不使用mutablemap.有没有没有可变映射的项目收集方法?我知道有一个方法collect,但无法正常工作.
当前方式:
val result = mutableMapOf<Int, MutableMap<Int, Double>>()
Files.lines(Paths.get(folderPath))
.map { line -> line.split(",") }
.map { items -> Triple(items[0].toInt(), items[1].toInt(), items[2].toDouble()) }
.forEach { (id, article, rating) ->
if (result.containsKey(id))
result[id]!!.put(article, rating)
else
result.put(id, mutableMapOf(Pair(article, rating)))
}
编辑:
我的目标是根据三元组的第一个值合并三元组对象.
因此,场景将是两个三重对象(1、2、5.5)和(1、3、5.5).三元组的第一个值是用户ID,第二个是商品ID,第三个是商品的评分.
合并后,地图中将只有一个条目,其中包含第一个键=用户ID,三元组的第一个值,并且该值将是一个包含用户评价的商品的地图.
目前,我希望它能正常工作,但我想知道是否有更实用的方法来解决此问题.
解决方法:
您可以这样做:
val result: Map<Int, Map<Int, Double>> = Files.lines(Paths.get(folderPath))
.map { it.split(",") }
.collect(groupingBy({ it[0].toInt() },
toMap<List<String>, Int, Double>({ it[1].toInt() }) { it[2].toDouble() }))
编译器似乎无法推断toMap的类型,因此我在此处添加了类型提示.
我要指出的是Kotlin没有不变的Map实现. mapOf返回的默认值是可变的java.util.LinkedhashMap.只是Map接口没有公开变异方法(例如put,putAll).并且您可以自由分配MutableMap< Int,MutableMap< Int,Double>>.到Map< Int,Map< Int,Double>> ;,这也是我在这里对结果进行类型注释的方式,我强制将静态类型设为不变的Map.
标签:java-stream,kotlin,immutability,java,functional-programming 来源: https://codeday.me/bug/20191026/1932769.html