一种在java stream api中指定Collector初始容量的优雅方法

the*_*aba 6 java-8 collectors

我试图找到一种在java stream api中设置收集器初始容量的好方法.最简单的例子是:

data.stream()
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我只想将一个带有list大小的int传递给collector,以便不调整内部数组的大小.第一个意图是这样做:

data.stream()
        .collect(Collectors.toList(data.size()));
Run Code Online (Sandbox Code Playgroud)

但不幸的是,toList没有重载以使用参数.我发现了一个解决方案,但它闻起来:

 data.stream()
        .collect(Collectors.toCollection(() -> new ArrayList<>(data.size())));
Run Code Online (Sandbox Code Playgroud)

有没有办法表达它更简单?

Lac*_*lev 1

我不知道 API 中有任何直接的方法来确保在后台使用的可变容器收集数据的能力。我可能猜测,至少众多原因之一是通过调用来支持并行性parallelStream()

因此,如果您的数据是并行处理的,即使您知道底层容器(例如)支持容量,提供初始容量也没有多大意义ArrayList。多个容器将由不同的线程创建,然后组合起来,容量至少会损害整体性能。

如果你想要真正具体和优雅,你也可以尝试实现你自己的收集器。这并不难。