Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin/Java在地图中收集地图的功能性和不可变的方法_Java_Functional Programming_Java Stream_Kotlin_Immutability - Fatal编程技术网

Kotlin/Java在地图中收集地图的功能性和不可变的方法

Kotlin/Java在地图中收集地图的功能性和不可变的方法,java,functional-programming,java-stream,kotlin,immutability,Java,Functional Programming,Java Stream,Kotlin,Immutability,目前,我正在通过javaapi读取一个文件,并通过foreach方法将项目添加到映射中,这迫使我使用mutablemap。有没有一种不用可变地图收集物品的方法?我知道有一种收集方法,但我无法让它工作 目前的方式: val result = mutableMapOf<Int, MutableMap<Int, Double>>() Files.lines(Paths.get(folderPath)) .map { lin

目前,我正在通过javaapi读取一个文件,并通过foreach方法将项目添加到映射中,这迫使我使用mutablemap。有没有一种不用可变地图收集物品的方法?我知道有一种收集方法,但我无法让它工作

目前的方式:

    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)))
                    }
val result=mutableMapOf()
Files.line(path.get(folderPath))
.map{line->line.split(“,”)}
.map{items->Triple(items[0].toInt(),items[1].toInt(),items[2].toDouble())}
.forEach{(id、文章、评级)->
if(结果容器(id))
结果[id]!!.put(文章、评级)
其他的
result.put(id,mutableMapOf(Pair(article,rating)))
}
编辑:

我的目标是基于三元组的第一个值合并三元组对象。 所以一个场景是两个三重对象(1,2,5.5)和(1,3,5.5)。三元组的第一个值是用户id,第二个值是文章id,第三个值是文章的评级。 合并后,地图中将有一个条目,其中包含第一个键=用户id、三元组的第一个值,该值将是一个地图,其中包含用户评分的文章


它目前正在以我希望的方式工作,但我很好奇是否有更实用的方法来解决这个问题。

我对
Kotlin
不太满意,但似乎您应该使用一个简单的:
收集器。collectingAndThen
。比如:

  System.out.println(Stream.of(1, 2, 3, 1)
             .collect(Collectors.collectingAndThen(
                  Collectors.groupingBy(Function.identity(), Collectors.counting()),
                       Collections::unmodifiableMap)));
其思想是收集到一个可变映射,然后将其包装到一个不可变映射中

顺便说一句,如果类路径上有
guava
,它有收集到
ImmutableMap
的构建收集器,则可以执行以下操作:

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() }))
val结果:Map=Files.line(path.get(folderPath))
.map{it.split(“,”)}
.collect(groupingBy({it[0].toInt()}),
toMap({it[1].toInt()}{it[2].toDouble()}))
编译器似乎无法推断
toMap
的类型,因此我在那里添加了一个类型提示


我要指出,Kotlin没有一个不变的
Map
实现。
mapOf
返回的默认值是
java.util.LinkedhashMap
,它是可变的。只是
Map
接口没有公开变异方法(比如
put
putAll
)。您可以自由地将
MutableMap
分配给
Map
,这也是我在
result
上的类型注释所做的,我强制静态类型为不可变的
Map
,谢谢!那么类型提示就是列表?@ErikW类型提示就是
,实际上是填充方法的每个泛型类型。那么列表就是一个占位符,只是为了填充方法的泛型类型?@ErikW否,在运行时没有
列表
。通常您只需调用
toMap(…)
而不调用
,但在这种情况下,编译器无法确定该方法的泛型类型。所以我明确地告诉它使用哪种类型。