我有一个集合,我想使用流API将其减少为单个值。看起来collect
或reduce
效果很好,但两者都希望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)
对我不起作用。
答案 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();