因此,最终从 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 和流需要最终变量。我尝试探索一下DoubleStream
得到一个sum()
,但我需要将当前总和重新应用于每个Function
并将该总和添加到下一个函数,如上面的代码示例所示。
这可以用纯 Stream API 实现吗?
编辑:所以在测试之后reduce()
区域,我对执行此类计算所需的时间进行了简单的测试,结果不利于流。这是一个例子https://gist.github.com/gabizou/33f616c08bde5ab97e56 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));
}
生成组合函数的流操作不存在关联性问题,理论上甚至可以并行运行(尽管这里没有任何好处),而结果是单个函数,其本身是顺序的,并且永远不会分解为需要的部分具有关联性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)