【问题标题】:How do I build a Java `Map<K,V>` out of `List<Map.Entry<K,V>>`? [duplicate]如何从 `List<Map.Entry<K,V>>` 构建 Java `Map<K,V>`? [复制]
【发布时间】:2018-11-11 11:25:42
【问题描述】:

我有一个List&lt;Map.Entry&lt;Long, String&gt;&gt;

如何将其转换为Map

目前我正在执行以下操作,但似乎有点冗长(最重要的是,它不是“流利的”,即单个表达式,但需要代码块)。

Map<Long, String> result = new HashMap<>();
entries.forEach(e -> result.put(e.getKey(), e.getValue()));
return result;

Java 10 很好。

【问题讨论】:

  • 我会选择 Java 11,因为 10 是 eol。
  • @PeterLawrey 已经?哦,我的,他们移动得很快……
  • Java 11 将在 4 个月内 EOL :P 那时许多人可能会转向 OpenJDK 11,而不是跳到 12。例如adoptopenjdk.net
  • 无论如何,我的意思是“允许使用 Java 10 API”(希望我们现在的样板文件比 Java 8 流收集器少)。 Java 11 是否在这里带来了一些新的东西(例如集合文字)?
  • 不是真的恕我直言,你可以写entries.forEach((var e) -&gt; result.put(e.getKey(), e.getValue())); 注意var e,真正的优势是长期支持能力。

标签: java


【解决方案1】:

如果您确定没有重复键,这就足够了:

Map<Long, String> result = entries.stream().collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

如果可能有重复,您必须添加一个合并函数来处理它们。

【讨论】:

  • 嗯。我将它设为 Map.Entry 列表,专门是为了避免再次指定 ::getKey::getValue 应该是什么,但我想我必须这样做。
  • 我确实喜欢来自重复线程的番石榴回答。 stackoverflow.com/a/44904884/14955java.util.Map.ofEntries 也很接近,但不适用于列表。
  • 如果我有重复但没有合并功能会怎样?
  • @Thilo 抛出异常。
【解决方案2】:

展平它:

Map<Long, String> result = 
    entries.stream()
        .collect(toMap(e -> e.getKey(), e -> e.getValue(), (a, b) -> b);

(a, b) -&gt; b 表示将采用重复键的最后一个值,这与您当前方法的语义相匹配。

【讨论】:

  • Map.Entry 没有名为 entrySet 的方法
  • @Ferrybig 我的错,我以为是地图列表。
猜你喜欢
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 2013-12-20
  • 2011-03-06
  • 2018-11-23
  • 2019-10-10
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多