首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-> 8 Collectors.toMap ->重复密钥

-> 8 Collectors.toMap ->重复密钥
EN

Stack Overflow用户
提问于 2019-08-01 14:36:32
回答 1查看 6K关注 0票数 2

我正在尝试将List of available Currency转换为Map,以便根据我希望得到的字符串代码查找货币数字代码。这是密码。

但是上面的代码在错误下面,我对Java 8非常陌生,因此我的头撞到了头上:

代码语言:javascript
复制
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalStateException: Duplicate key YUM
    at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
    at java.util.HashMap.merge(HashMap.java:1254)
    at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1556)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)

但是上面这段代码在错误之下,我对Java 8非常陌生,因此我的头被撞了。

代码语言:javascript
复制
public class IsoCurrencyCode {

  private static final Set<Currency> ISO_CURRENCY = Currency.getAvailableCurrencies();

  private static final Map<Integer, Currency> NUMERIC_MAP = ISO_CURRENCY.stream().collect(Collectors.toMap(Currency::getNumericCode, Function.identity()));

  public static void main(String[] args) {
    //
    Currency currency = NUMERIC_MAP.get(971);
    System.out.println(currency.getCurrencyCode());
  }
}

它应该将所有货币以代码作为键加载到地图中。

EN

回答 1

Stack Overflow用户

发布于 2019-08-01 14:41:20

Collectors.toMap()不接受密钥的复制。

由于对于Currency::getNumericCodetoMap()会在遇到重复键时抛出此异常。

代码语言:javascript
复制
Caused by: java.lang.IllegalStateException: Duplicate key YUM

请注意,这里的错误消息具有误导性。键是Integer,而YUM不是。YUM看起来像一个Currency实例,也就是说。

实际上,YUM指的是由toMap()处理的具有重复键的值(Currency)之一,而不是键值本身。这是一个Java 9中的Java错误

要解决问题,可以使用Collectors.groupingBy()收集到Map<Integer, List<Currency>>,在本例中,您可以按键获得多个值,或者作为替代,将重复的键与toMap()重载合并,例如保留最后一个条目:

代码语言:javascript
复制
private static final Map<Integer, Currency> NUMERIC_MAP = 
ISO_CURRENCY.stream()
            .collect(Collectors.toMap(Currency::getNumericCode, Function.identity(), (v1, v2)-> v2);

要回答您的评论,您可以这样找到罪魁祸首代码(重复):

代码语言:javascript
复制
Map<Integer, List<Currency>> dupMap = 
ISO_CURRENCY.stream()
            .collect(Collectors.groupingBy(Currency::getNumericCode)
            .entrySet()
            .filter(e -> e.getValue().size() > 1)
            .collect(Collectors.toMap(Entry::getKey,Entry::getValue));

System.out.println(dupMap);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57311435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档