Java流的非关联约化
您可能知道,Java流API处理关联的缩减操作;这允许通过拆分并行执行还原。然而,我们是否有严格按顺序进行的还原操作的模拟 考虑这一点: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
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)
…