- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将可用 Currency
的 List
转换为 Map
,要根据 Currency Numeric code 进行查找,我想获取 String代码。这是代码。
但是上面的代码抛出了以下错误,我对 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());
}
}
它应该使用代码作为键将所有货币加载到 map 中。
最佳答案
Collectors.toMap()
不接受重复的键。
既然你有 Currency::getNumericCode
, toMap()
遇到重复键时抛出此异常。
Caused by: java.lang.IllegalStateException: Duplicate key YUM
请注意,此处的错误消息具有误导性。键是 Integer
同时 YUM
不是。 YUM
看起来像 Currency
实例就是这样。
事实上,YUM
指由 Currency
处理的值之一 ( toMap()
)具有重复键,而不是键值本身。这是一个 Java bug fixed in Java 9 .
要解决您的问题,请使用 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);
关于java-8 - Java 8 -> Collectors.toMap -> 重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57311435/
正如标题所述,将 LinkedHashMap 转换为 Map 是否会保留元素的存储顺序? 我相信不是,但找不到任何证据。 或者,在 Scala 中是否有任何不可变 Map 的实现保留了插入元素的顺序?
我正在编写一个简单的表达式,其中我必须收集 String 的 Map 与数组中的索引列表。为此,我尝试使用 Collectors.toMap(keyMapper, valueMapper, merg
我需要将 JSONObject 转换为 Map。 我注意到 JSONObject 有一个 .toMap() 方法... 出于好奇,我深入研究了对象本身,我注意到它有一个私有(private)成员映射,
我无法理解,也找不到具有 Supplied 参数的 Collectors.toMap 方法的合适示例; this one . 我完全理解其他方法,包括创建键、值、处理重复项的二进制文件的函数,我只是不
我很难在 Java 中使用流 API 来处理泛型映射。我有一张以下列方式扩展 LinkedHashMap 的 map public class LRUCache extends LinkedHashM
这个问题已经有答案了: Java 8 function that always return the same value without regarding to parameter (1 个回答)
如果我们想象,我们有一个叫做人的对象,人看起来像下面这样: class Person { int id; String name; String country //
所以可能有一个 abc 用于多次付款,现在我有: //find abc id for each payment id Map abcIdToPmtId = paymentController.find
我需要创建 Map来自 List使用 Stream API。 persons.stream() .collect(Collectors .toMap(Person
这段代码无法编译 List pairs = new ArrayList<>(); System.out.println(pairs.stream().collect(Collectors.toMap(
我的情况是 Player开发项目中的对象,任务只是测量距离并返回低于特定阈值的结果。当然,我想尽可能以最简洁的方式使用流。 目前,我有一个映射流的解决方案,然后通过迭代器进行过滤: Stream st
我正在尝试创建一个相当简单的 Collector转换 Stream进入 Map ,但是 javac 提示泛型。无法弄清楚为什么它不起作用。 import java.util.Map; import j
我有一个语言列表,如英语、法语等。我还有一个单词列表,如苹果、橙子等。对于每个单词,我想创建一个如下所示的 map : map map = {english = apple, italian = me
有一个来自 Apache 的开源 util 库,我在其中找到了一种将数组转换为映射的方法: public static Map toMap(Object[] array) { if (arra
我正在尝试在 ZipEntry 的 Stream 上使用 java8 的 Collectors.toMap。这可能不是最好的主意,因为在处理过程中可能会发生异常,但我想这应该是可能的。 我现在遇到一个
我有一个 List集合,其中 UserMeal 有: public class UserMeal { private final LocalDateTime dateTime; private f
这个问题在这里已经有了答案: How to get the key in Collectors.toMap merge function? (3 个答案) Collectors.toMap with
前言 在实际项目中我们经常会用到 List 转 Map 操作,在过去我们可能使用的是 for 循环遍历的方式。举个例子: 先定义类: ?
我从互联网上得到了这段代码,但我似乎无法理解它或在互联网上找到任何关于它的东西。 在下面的代码中 toMap 是一个返回 2 个项目的方法,这怎么可能? 什么是fromMap,它是用户创建的方法吗?我
是否有任何惯用的 JavaScript 解决方案: var addTuple = function(map,tuple) { map[tuple[0]] = tuple[1]; return map}
我是一名优秀的程序员,十分优秀!