使用流将映射<字符串,设置<String>>展平到列表<String>(CSV转换)



给定输入(映射键:值)

"a":["e","c","d"]
"b":["c"]

所需的排序输出:

"a,c"
"a,d"
"a,e"
"b,c"

您可能要寻找的是使用具有某种值的flatmap,以将转换的整数值比较为:

return map.entrySet().stream()
        .flatMap(e -> e.getValue().stream()
                .sorted(Comparator.comparingInt(Integer::parseInt)) // or just .sorted()
                .map(v -> e.getKey() + "," + v))
        .collect(Collectors.toList());

要保持此可读性,最好以两种方法将代码拆分,因此您不会嵌入flatMap逻辑:

public List<String> toPairs(Map<String, Set<String> map) {
    return map.entrySet().stream()
        .flatMap(this::entryPairs)
        .sorted() // if you want the whole output to be sorted
        .collect(Collectors.toList())
}
private Stream<String> entryPairs(Map.Entry<String, Set<String>> entry) {
    return entry.getValue().stream()
        // .sorted() // you can sort the values for each key here, but this is useless if you're sorting above
        .map(v -> entry.getKey() + ',' + v)
}

不确定它是否是一个完美的解决方案,但它正在起作用。

map.entrySet().stream()
  .map(entry.getValue().stream()
     .sorted()
     .map(value->entry.getKey()+","+value)
     .collect(Collectors.joining("n"))
  )
  .sorted()
  .collect(Collectors.joining("n"));

最新更新