带有嵌套HashMap的Java并行流

时间:2018-10-25 14:33:05

标签: java java-stream

鉴于嵌套的HashMap HashMap<Integer,HashMap<Integer,BigDecimal>>,可以将带有并行流的内部HashMap值设置为零, 可接受的副作用并遵守无干扰规则?

例如,给定HashMap:

HashMap<Integer,HashMap<Integer,BigDecimal>> myMap = null;

是每个中的最终for

myMap.entrySet().parallelStream().forEach(e -> {
            e.getValue().entrySet().parallelStream().forEach(e1 -> {
                e1.setValue(new BigDecimal(0));
                });
        });

可接受的副作用并遵守无干扰规则吗?

1 个答案:

答案 0 :(得分:0)

  

...是否可以将并行流的内部HashMap值设置为零...

似乎可行,但是HashMap不是线程安全的实现,因此我不鼓励您使用这种方式。

  

...具有可接受的副作用并遵守无干扰规则?

您使用Stream::for有副作用,因为它更改了Stream的来源。建议您使用Stream::map,然后再使用一个Map将结构收集回parrallelStream

Map<Integer, Map<Integer,BigDecimal>> myMap2 = myMap.entrySet().parallelStream()
    .map(e -> new AbstractMap.SimpleEntry<>(
        e.getKey(), 
        e.getValue().entrySet().stream()
                               .collect(Collectors.toMap(Entry::getKey, i -> BigDecimal.ZERO))))
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));