Java流的非关联约化

Java流的非关联约化,java,java-8,reduce,java-stream,Java,Java 8,Reduce,Java Stream,您可能知道,Java流API处理关联的缩减操作;这允许通过拆分并行执行还原。然而,我们是否有严格按顺序进行的还原操作的模拟 考虑这一点: public interface ExpressionFactory { public Expression createExpression(Expression inner); } public interface Expression { public void evaluate(); } public class Sequentia

您可能知道,Java流API处理关联的缩减操作;这允许通过拆分并行执行还原。然而,我们是否有严格按顺序进行的还原操作的模拟

考虑这一点:

public interface ExpressionFactory {
    public Expression createExpression(Expression inner);
}

public interface Expression {
    public void evaluate();
}

public class SequentialExpressionFactory implements ExpressionFactory {
    private final List<ExpressionFactory> factories;
}
公共接口表达式工厂{
公共表达式createExpression(表达式内部);
}
公共接口表达式{
公共空间评估();
}
公共类SequentialExpressionFactory实现ExpressionFactory{
私营最终工厂名单;
}
我们要做的是让
SequentialExpressionFactory
中的
createExpression()
实现返回一个
表达式
,该表达式包括从基本表达式开始,为每个工厂调用
createExpression()
,使用一个工厂的输出作为下一个工厂的输入。当然,这当然是一个可行的for循环,但是让我们试着在这里考虑流API的使用。 如果我们尝试使用流API,那么我们将不得不使用
reduce()
,但是
reduce()
需要一个组合器。考虑到
SequentialExpressionFactory
必须按顺序计算每个
表达式
,组合器的概念在语义上没有真正意义。当然,使用抛出组合器不仅仅是一种代码味道,我们不能保证永远不会使用抛出组合器(当然,当还原操作“有时”给出正确结果时,它会导致脆性)。此外,按照我们的方式,这实际上不是关联操作,流API要求还原操作是关联的


同样,考虑到这个操作以及需要做什么是缩减操作,是否有一个(第三方)“序列”类似于流API,可以做这些非关联的缩减操作?

它不是第三方;它是传统的Java
Iterable
API。如果有必要,您可以调用
Stream.iterator()
,对流进行顺序迭代。

我希望有一些东西可以将迭代内部化,而不是使用
iterator()
(这似乎使流API的使用变得多余)。我想是“迭代器包装器”,那么……不,没有办法做到这一点。任何声称这样做的第三方库都将在内部进行。@Kelvin Chung:可能会有点晚,但当然,如果您在流上使用
forEachOrdered(Consumer)
方法,您可以使用内部迭代。请注意,即使是
迭代器
迂回也允许通过
stream.Iterator()进行内部迭代。foreachrestain(consumer)