关于java:在不存在合并功能的情况下在流上收集/还原

Collect/reduce on a stream when no combine function exists

我有一个集合,我想在其中使用流API将其减少为单个值。看起来collectreduce可以很好地工作,只是他们两个都希望combiner对象合并并行结果。就我而言,我没有合并操作。

流中不会有很多元素,所以我很高兴能够串行运行。有办法解决吗?

如果我的流包含1,2和3,我想做等价于

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

似乎

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

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

我返回的是其他类型,所以reduce(BiFunction)对我不起作用。


我只会在集合的元素上使用一个循环:

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

这很容易理解,具有与streams方法类似的冗长性,并且您不必担心由于Streams库中的黑暗伏都教徒,其行为会意外地发生变化。


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

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