如何显式使用顺序收集器
How to explicitly use a sequential Collector
首先断言顺序 == !parallel
Java-8 Stream
接口提供了两个collect
方法:
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
<R, A> R collect(Collector<? super T, A, R> collector);
我需要一个收集器,它按顺序收集(或可变减少)元素(用例:多个地图(元素可以是地图,递归地)合并,顺序相关)。组合器不是必需的(Collectors.of
方法也需要组合器)。有没有更好的方法以某种方式明确地执行此操作?
- 使用自定义
Collector
?
- 类似
of
组合器的无参数方法?
- 来自库的现有方法?
或不一定是顺序收集器,而是严格从左到右的组合器的并行方法。
确实正确的关键词应该是Folding Collector.
您不需要顺序收集器,而是折叠收集器。这个收集器甚至可以使用并行流来并行执行上游操作,然后像 forEachOrdered()
那样严格地从左到右减少。不幸的是,当前 Stream API 不支持有序收集器。我在 core-libs-dev 中有一个关于添加特殊特征的可能性的 short discussion,这将表明收集器不支持组合,但在 Java-9 中在这个方向上仍然没有进展。
首先断言顺序 == !parallel
Java-8 Stream
接口提供了两个collect
方法:
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
<R, A> R collect(Collector<? super T, A, R> collector);
我需要一个收集器,它按顺序收集(或可变减少)元素(用例:多个地图(元素可以是地图,递归地)合并,顺序相关)。组合器不是必需的(Collectors.of
方法也需要组合器)。有没有更好的方法以某种方式明确地执行此操作?
- 使用自定义
Collector
? - 类似
of
组合器的无参数方法? - 来自库的现有方法?
或不一定是顺序收集器,而是严格从左到右的组合器的并行方法。
确实正确的关键词应该是Folding Collector.
您不需要顺序收集器,而是折叠收集器。这个收集器甚至可以使用并行流来并行执行上游操作,然后像 forEachOrdered()
那样严格地从左到右减少。不幸的是,当前 Stream API 不支持有序收集器。我在 core-libs-dev 中有一个关于添加特殊特征的可能性的 short discussion,这将表明收集器不支持组合,但在 Java-9 中在这个方向上仍然没有进展。