Kotlin/Java在地图中收集地图的功能性和不可变的方法
目前,我正在通过javaapi读取一个文件,并通过foreach方法将项目添加到映射中,这迫使我使用mutablemap。有没有一种不用可变地图收集物品的方法?我知道有一种收集方法,但我无法让它工作 目前的方式: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
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(…)
而不调用
,但在这种情况下,编译器无法确定该方法的泛型类型。所以我明确地告诉它使用哪种类型。