java - 用 Java 8 Streams 替换传统的 newForLoop

标签 java foreach lambda java-8 java-stream

因此,最终从 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/

相关文章:

java - 如何在一个文件中写入多个LinkLists并将LinkedLists读入LinkedList的ArrayList?

java - 写入 PDF 文档后使用 iText 打开它们

java - 使用带有 Maps 键集的流时出现 ConcurrentModificationException

python - 带有 lambda 函数字典的 python 中的奇怪行为

java - JSOUP 和 Android 模拟器 - 无法解析主机

java - 是否可以使用java更改ldap中用户的基本DN?

php - mysql事务在循环中捕获错误

python - lambda 函数闭包捕获了什么?

java - Java 8 流中的非干扰确切含义