如何在Java 8中映射地图中的值?

sil*_*edh 52 java lambda map java-8

说我有一个Map<String, Integer>.有一种简单的方法可以从中得到Map<String, String>它吗?

通过简单,我的意思是不喜欢这样:

Map<String, String> mapped = new HashMap<>();
for(String key : originalMap.keySet()) {
    mapped.put(key, originalMap.get(key).toString());
}
Run Code Online (Sandbox Code Playgroud)

而是一些像以下一样的班轮:

Map<String, String> mapped = originalMap.mapValues(v -> v.toString());
Run Code Online (Sandbox Code Playgroud)

但显然没有办法mapValues.

ass*_*ias 107

您需要流式传输条目并在新地图中收集它们:

Map<String, String> result = map.entrySet().stream()
                  .collect(Collectors.toMap(Entry::getKey, e -> String.valueOf(e.getValue()));
Run Code Online (Sandbox Code Playgroud)

  • 请注意,链接重复项的答案包括使用 Guava 的替代解决方案:“Map&lt;String, String&gt; byNameMap = Maps.transformValues(people, Person::getName);”,它包装原始 Map 并在您执行转换时进行转换get,意味着你只需要在实际消费价值时支付转化成本。” (3认同)
  • 我更喜欢这个,而且它甚至只有一行(技术上)。+1 (2认同)

ski*_*iwi 22

最简单的方法是:

Map<String, Integer> map = new HashMap<>();
Map<String, String> mapped = map.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey, entry -> String.valueOf(entry.getValue())));
Run Code Online (Sandbox Code Playgroud)

你在这里做的是:

  1. 获得一个 Stream<Map.Entry<String, Integer>>
  2. 在结果地图中收集结果:
    1. 将条目映射到其密钥.
    2. 将条目映射到新值,并入String.valueOf.

你不能在一个单行中做的原因是因为Map接口没有提供这样的,你可以得到的最接近的是map.replaceAll,但是该方法规定类型应该保持不变.

  • @StephenHarrison我知道这一点.我正在添加空地图部分以指示输出地图的来源.你不能简单地编写代码并且在其中有一个未定义的变量. (7认同)
  • @StephenHarrison 我什至在评论中解释了这一点。 (2认同)