没有组合功能时,在流上收集/减少

时间:2017-02-17 21:03:59

标签: java java-stream

我有一个集合,我想使用流API将其减少为单个值。看起来collectreduce效果很好,但两者都希望combiner对象合并并行结果。在我的情况下,我没有合并操作。

流中不会有很多元素,所以我很高兴让它连续运行。有办法解决这个问题吗?

如果我的流包含1,2和3,我想做相同的

result = new Foo().foo(1).foo(2).foo(3);

似乎

result = stream.reduce(new Foo(),
                       (foo, ele) -> foo.foo(ele),
                       null);

可能会有效,但在某些时候,某些更改(稍长的列表,新的Java版本)combiner将被调用,并且会中断。

我将返回其他类型,因此reduce(BiFunction)对我不起作用。

2 个答案:

答案 0 :(得分:1)

我只是对集合的元素使用循环:

Foo result = new Foo();
for (int ele : collection) {
  result = result.foo(ele);
}

这很容易阅读,类似于溪流方法的详细程度,你不必担心它的行为会因为Streams库中的黑暗伏都而意外地改变。

答案 1 :(得分:1)

如果您希望坚持使用流,则可以使用forEachOrdered,因为它可以是有状态的:

AtomicReference<Foo> foo = new AtomicReference<>(new Foo());
stream.forEachOrdered(ele -> foo.updateAndGet(f -> f.foo(ele)));        
Foo result = foo.get();