我正在尝试将Map<String, List<String>>
转换为Map<String, String>
,其中每个键的值是通过连接上一个地图中List
中的所有值而构建的关节字符串,例如:
A -> ["foo", "bar", "baz"]
B -> ["one", "two", "three"]
应转换为
A -> "foo|bar|baz"
B -> "one|two|three"
使用Java 8 Streams API执行此操作的惯用方法是什么?
答案 0 :(得分:41)
只需使用String.join
,无需创建嵌套流:
Map<String, String> result = map.entrySet()
.stream()
.collect(toMap(
e -> e.getKey(),
e -> String.join("|", e.getValue())));
答案 1 :(得分:30)
您可以使用Collectors.joining(delimiter)
执行此任务。
Map<String, String> result = map.entrySet()
.stream()
.collect(toMap(
Map.Entry::getKey,
e -> e.getValue().stream().collect(joining("|")))
);
在此代码中,地图中的每个条目都会收集到新地图中:
String
答案 2 :(得分:6)
Google Guava有一个很好的辅助方法:
com.google.common.collect.Maps.transformValues(map, x -> x.stream().collect(joining("|")));
使用纯java,这可以工作:
map.entrySet().stream().collect(toMap(Entry::getKey, e -> e.getValue().stream().collect(joining("|"))));