Java 流的非关联归约
Nonassociative reductions with Java Streams
如您所知,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;
}
我们想要做的是在 SequentialExpressionFactory
return 中实现 createExpression()
一个 Expression
,它包括从基本表达式开始并调用 createExpression()
对于每个工厂,使用一个工厂的输出作为下一个工厂的输入。这当然可以通过 for 循环轻松实现,但让我们在这里尝试考虑 Stream API 的使用。
如果我们尝试使用 Stream API,那么我们将不得不使用 reduce()
,但是 reduce()
需要一个组合器。鉴于 SequentialExpressionFactory
必须按顺序 评估每个 Expression
,从语义上讲,组合器的概念实际上没有意义。当然,使用 throwing combiner 不仅仅是一种代码味道,我们不能保证 throwing combiner 永远不会被使用(当然,当 reduction 操作给出正确的结果时它会导致脆弱 "some of the time")。此外,按照我们的方式,这实际上不是关联操作,Stream API 需要归约操作才能关联。
同样,给定此操作并需要执行什么是归约操作,是否有(第三方)"sequence" 类似于 Stream API 的东西可以执行这些非关联归约操作?
不是第三方;这是传统的 Java Iterable
API。如有必要,您可以调用 Stream.iterator()
顺序迭代流。
如您所知,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;
}
我们想要做的是在 SequentialExpressionFactory
return 中实现 createExpression()
一个 Expression
,它包括从基本表达式开始并调用 createExpression()
对于每个工厂,使用一个工厂的输出作为下一个工厂的输入。这当然可以通过 for 循环轻松实现,但让我们在这里尝试考虑 Stream API 的使用。
如果我们尝试使用 Stream API,那么我们将不得不使用 reduce()
,但是 reduce()
需要一个组合器。鉴于 SequentialExpressionFactory
必须按顺序 评估每个 Expression
,从语义上讲,组合器的概念实际上没有意义。当然,使用 throwing combiner 不仅仅是一种代码味道,我们不能保证 throwing combiner 永远不会被使用(当然,当 reduction 操作给出正确的结果时它会导致脆弱 "some of the time")。此外,按照我们的方式,这实际上不是关联操作,Stream API 需要归约操作才能关联。
同样,给定此操作并需要执行什么是归约操作,是否有(第三方)"sequence" 类似于 Stream API 的东西可以执行这些非关联归约操作?
不是第三方;这是传统的 Java Iterable
API。如有必要,您可以调用 Stream.iterator()
顺序迭代流。