【发布时间】: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