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

时间:2017-05-27 19:47:46

标签: java functional-programming java-stream kotlin immutability

目前,我正在通过Java API读取文件,并通过foreach方法将项目添加到地图,这迫使我使用mutablemap。有没有办法收集没有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)))
                    }

编辑:

我的目标是根据三元组的第一个值合并三元组对象。 因此,场景将是两个三重对象(1,2,5.5)和(1,3,5.5)。三元组的第一个值是用户ID,第二个是文章ID,第三个是文章的评级。 合并后,地图中会有一个条目包含第一个键=用户ID,三元组的第一个值,而值将是包含用户评价的文章的地图。

目前我正在努力工作,但我很好奇是否有更实用的解决方法。

2 个答案:

答案 0 :(得分:2)

我对Collectors.collectingAndThen感到不舒服,但您似乎应该使用简单的 System.out.println(Stream.of(1, 2, 3, 1) .collect(Collectors.collectingAndThen( Collectors.groupingBy(Function.identity(), Collectors.counting()), Collections::unmodifiableMap))); 。类似的东西:

guava

这个想法是你收集到一个可变的地图,然后将其包装成一个ImmutableMap。

如果您在类路径上拥有ImmutableMap - 它会构建收集器,收集到pic_url = bsObj.find('img', {"class":"image lazy-load"})['data-delayed-url'] response = requests.get(pic_url, stream=True) with open(path + output['name'][0] + '.jpg', 'wb') as out_file: response.raw.decode_content = True shutil.copyfileobj(response.raw, out_file)

答案 1 :(得分:2)

你可以这样做:

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接口不公开变异方法(如putputAll)。你可以自由地将MutableMap<Int, MutableMap<Int, Double>>分配给Map<Int, Map<Int, Double>>,这也是我在result上使用类型注释所做的,我强迫静态类型是不可变的Map