编程语言
首页 > 编程语言> > Kotlin / Java在地图中收集地图的功能和不变方法

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>&gt ;,这也是我在这里对结果进行类型注释的方式,我强制将静态类型设为不变的Map.

标签:java-stream,kotlin,immutability,java,functional-programming
来源: https://codeday.me/bug/20191026/1932769.html