在 Java 流中的终端操作之后使用中间操作



我正在浏览查找归一化平均值的解决方案之一,我很惊讶地遇到了一个在终端操作(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);
}
}

这之所以有效,是因为您使用的重载Stream#reduce方法返回Optional<T>而不是Stream<T>

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

最新更新