【问题标题】:Using an intermediate Operation after a terminal Operation in Java Streams在 Java 流中的终端操作之后使用中间操作
【发布时间】:2020-10-07 12:24:23
【问题描述】:

我正在查看一种用于找到归一化均值的解决方案,我惊讶地发现在终端操作 (reduce) 之后使用中间操作 (map) 的解决方案。我自己测试了它并且它有效。我读过在应用终端操作后流结束,那么为什么这个解决方案完全有效?。

//Normalized mean
    static double normalizedMean(Stream<Integer> stream) {
        return stream.map(x -> new NM(x,x,x,1))
                .reduce((x, y) -> new NM(x.sum + y.sum,
                        x.max > y.max ? x.max : y.max,
                        x.min < y.min ? x.min : y.min,
                        x.n + 1)
                )
                .map(x -> x.compute())
                .filter(x -> !x.isNaN())
                .orElse(0.0);
    }


class NM {
    final int sum;
    final int max;
    final int min;
    final int n;
    NM(int a, int b, int c, int d) {
        sum = a;
        max = b;
        min = c;
        n = d;
    }
    double compute() {
        return ((double) sum / n - min) / (max - min);
    }
}

【问题讨论】:

  • 你打电话给Optional.map而不是Stream.map!那不是Stream上的操作,没有中间或终端操作的概念。

标签: java functional-programming java-stream


【解决方案1】:

这是因为您使用的重载 Stream#reduce 方法返回 Optional&lt;T&gt; 而不是 Stream&lt;T&gt;

Stream 不同,Optional 没有终端操作的概念,无法关闭。

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 2018-05-21
    • 2017-07-22
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多