在地图中加入List <string>

时间:2015-11-10 11:25:28

标签: java java-8 java-stream

我正在尝试将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执行此操作的惯用方法是什么?

3 个答案:

答案 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("|"))));