我如何知道Java Stream收集(Collectors.toMap)是否已并行化?

use*_*148 5 java parallel-processing java-stream

我有以下代码尝试通过Java Stream API以并行方式从List填充Map:

class NameId {...}

public class TestStream
{
    static public void main(String[] args)
    {
        List<NameId > niList = new ArrayList<>();
        niList.add(new NameId ("Alice", "123456"));
        niList.add(new NameId ("Bob", "223456"));
        niList.add(new NameId ("Carl", "323456"));

        Stream<NameId> niStream = niList.parallelStream();
        Map<String, String> niMap = niStream.collect(Collectors.toMap(NameId::getName, NameId::getId));
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何知道是否使用多个线程填充地图,即并行?我是否需要调用Collectors.toConcurrentMap而不是Collectors.toMap?这是一种合理的方式来并行化地图的人口吗?我怎么知道具体的地图支持新的niMap(例如它是HashMap)?

Car*_*ano 3

来自Javadoc

返回的Collector不是并发的。对于并行流管道,组合器函数通过将一个映射中的键合并到另一个映射中来进行操作,这可能是一项昂贵的操作。如果不需要将结果按遇到顺序插入到 Map 中,则使用 toConcurrentMap(Function, Function) 可能会提供更好的并行性能。

所以听起来toConcurrentMap会并行插入。

默认情况下,背景图是HashMap. toMap它只是调用需要 aSupplier<M>并传递的版本HashMap::new。(来源:来源)