Kotlin 将'List

Kotlin 将'List,kotlin,java-stream,reduce,collect,Kotlin,Java Stream,Reduce,Collect,在列表上执行parallelStream之后,我得到了一个列表如果您正在寻找一个等效的Java代码,您可以使用flatMap对所有条目进行流式处理,然后将它们收集为带有合并函数的映射,如下所示: Map<String, Set<String>> some(List<Map<String, Set<String>>> listOfMap) { return listOfMap.stream() .flatM

在列表上执行parallelStream之后,我得到了一个列表如果您正在寻找一个等效的Java代码,您可以使用flatMap对所有条目进行流式处理,然后将它们收集为带有合并函数的映射,如下所示:

Map<String, Set<String>> some(List<Map<String, Set<String>>> listOfMap) {
    return listOfMap.stream()
            .flatMap(a -> a.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (s1, s2) -> {
                        s1.addAll(s2);
                        return s1;
                    }));
}

我想出并实施了一个Kotlin特定的解决方案,即使用折叠操作符而不是减少或收集:

使用fold的一个好处是,我们不需要将数据类型从Map更改为MutableMap并设置为MutableSet

Map<String, Set<String>> some(List<Map<String, Set<String>>> listOfMap) {
    return listOfMap.stream()
            .flatMap(a -> a.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (s1, s2) -> {
                        s1.addAll(s2);
                        return s1;
                    }));
}
private val TYPES = listOf("string", "integer")

private fun getLinesOfEachTypeAcrossMultipleFiles(files: List<File>): Map<String, Set<String>> {
  return files
    .map { file ->
      TYPES.associate { it to getRelevantTypeLinesFromFile(file) }
    }

    .fold(mutableMapOf<String, MutableSet<String>>()) { acc, map ->
      acc.apply {
        map.forEach { key, value ->
          acc.getOrPut(key) { mutableSetOf() }.addAll(value)
        }
      }
    }
}

private fun getRelevantTypeLinesFromFile(it: File): Set<String> {
  // Sample code
  return setOf()
}