因此,最终从 Java 6 到 Java 8 有了相对较大的跳跃,我已经阅读了大量的 Java 8 Streams API。不幸的是,几乎所有被问到的例子都几乎接近我想弄清楚如何做的事情,但还不够接近。
我有的是
final List<Function<? super Double, Double>> myList = generateList();
final double myVal = calculate(10);
private double calculate(double val) {
for (Function<? super Double, Double> function : this.myList) {
val += function.apply(val);
}
return val;
}
现在,我开始明白我可以用 .stream().forEach()
做一些类似的事情,但这只适用于 foreach 并且流需要 final 变量。我尝试使用 DoubleStream
进行一些探索以获得 sum()
,但我需要将当前总和重新应用于每个 Function
并将该总和添加到下一个函数,如上面的代码示例所示。
纯 Stream API 是否可行?
编辑:因此在使用 reduce()
区域进行测试后,我对执行此类计算所需的时间进行了简单测试,结果不支持流。这是一个例子 https://gist.github.com/gabizou/33f616c08bde5ab97e56 .包括来自相当基本的测试的日志输出。
最佳答案
您可以使用流 API 从您的函数列表中组合一个函数。
static List<Function<? super Double, Double>> myList
= Arrays.asList(d -> d + 4, d -> d * 2, d -> d - 3);
static Function<Double, Double> total=myList.stream()
.map(f -> (Function<Double, Double>) d -> d + f.apply(d))
.reduce(Function::andThen).orElse(Function.identity());
static double calculate(double val) {
return total.apply(val);
}
public static void main(String[] args) {
System.out.println(calculate(10));
}
产生组合函数的流操作没有关联性问题,理论上什至可以并行运行(尽管这里没有任何好处),而结果是一个本身是顺序的函数,永远不会分解成多个部分这需要具有关联性。
关于java - 用 Java 8 Streams 替换传统的 newForLoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32338553/