【问题标题】:How to convert a stream to a HashMap (not Map) in Java 8如何在 Java 8 中将流转换为 HashMap(不是 Map)
【发布时间】:2017-05-05 22:21:34
【问题描述】:

我有一个流,我想明确地将它收集到一个 HashMap 中。现在,我正在做类似的事情

List<Item> listToTransform = //initialized and populated
HashMap<K, V> myHashMap = new HashMap<>();
listToTransform.stream().map(/* do my transformation here */)
.forEach(i -> myHashMap.put(i.getKey(), i.getValue()));

我想知道是否有一种方法可以使用 Collectors 显式取回 HashMap。

【问题讨论】:

标签: java java-8 hashmap java-stream


【解决方案1】:

Collectors.toMap 方法的重载之一将允许您选择您选择的地图实现。

不幸的是,这种重载的一个缺点是它还需要一个方法来在两个值具有相同键时合并它们(尽管我经常引用一个在这种情况下总是抛出的方法)。

HashMap<K, V> myHashMap = listToTransform.stream().map(/* do my transformation here */)
.collect(Item::getKey, Item::getValue, this::throwIllegalArgumentException, HashMap::new);

【讨论】:

  • 为什么你的例子中的合并函数只是抛出一个异常?您可以将其写为:(left, right) -&gt; right,它将充当键值的 replace - 就像 HashMap 自然地做...
  • 这是另一种选择。我个人的偏好,如果我不期望给定键的实例不止一个,那么如果发生这种情况,我会抛出。这样,我就知道我的数据或逻辑实际上有问题,我可以去相应地修复它(而添加 (left,right) -&gt; right 对我隐藏了这个事实)。
猜你喜欢
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
相关资源
最近更新 更多