Java 8 | HashMap的并行流处理

14

在Java 8中,他们添加了并行流(parallel stream),可以利用多核处理器。你可以像这样使用它:

List<String> list = new ArrayList<String>();
list.parallelStream().forEach(str -> System.out.println(str));

但是我该如何使用HashMap实现这样的功能呢?
Map<String, Integer> map = new HashMap<String, Integer>();
// won't work, because the Map class doesn't have the .parallelStream()
map.parallelStream().forEach((str, num) -> System.out.println(str + ":" + num));

有人知道如何做类似这样的事情吗?谢谢。
2个回答

38

你不能直接流式处理一个Map,但是你可以使用给定的entrySet() 方法来流式处理它的键值对集合。从条目对象中提取键和值。

map.entrySet()
   .parallelStream()
   .forEach(entry -> System.out.println(entry.getKey() + ":" + entry.getValue()));

1
是的,但调用.getValue()会降低性能吗? - John S.
2
相比之下呢?某段代码必须从条目中提取值(和键)。 - rgettman
4
也许你把Map.Entry.getValueMap.get搞混了。在这里调用getValue并不等同于查找Map。虽然它依赖于具体的map实现,但一个entry通常代表着某种已解析的映射,具有廉价的getKeygetValue方法,例如在java.util.HashMap中,我们是从entry实例中读取字段,而不是进行哈希查找。 - Holger

1
你可以通过调用map.entrySet()方法来获取哈希映射中的“entry set”,然后在返回的entry set上调用parallelStream()方法。
请注意,返回的对象是一个Map.Entry集合。你可以分别通过调用getKey()和getValue()方法来获取entry set项的键和值。具体如下:
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.entrySet().parallelStream().forEach((e) -> System.out.println(e.getKey() + ":" + e.getValue()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接