我正在尝试将List of available Currency转换为Map,以便根据我希望得到的字符串代码查找货币数字代码。这是密码。
但是上面的代码在错误下面,我对Java 8非常陌生,因此我的头撞到了头上:
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非常陌生,因此我的头被撞了。
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());
}
}它应该将所有货币以代码作为键加载到地图中。
发布于 2019-08-01 14:41:20
Collectors.toMap()不接受密钥的复制。
由于对于Currency::getNumericCode,toMap()会在遇到重复键时抛出此异常。
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()重载合并,例如保留最后一个条目:
private static final Map<Integer, Currency> NUMERIC_MAP =
ISO_CURRENCY.stream()
.collect(Collectors.toMap(Currency::getNumericCode, Function.identity(), (v1, v2)-> v2);要回答您的评论,您可以这样找到罪魁祸首代码(重复):
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);https://stackoverflow.com/questions/57311435
复制相似问题