Java 8 lambda表达式求值
我有一个类似于以下方法的方法:Java 8 lambda表达式求值,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个类似于以下方法的方法: public double[] foo(double[] doubleArray) { DoubleStream stream = Arrays.stream(doubleArray); return stream.map(s -> s / stream.sum()).toArray(); } 这种方法的复杂性是什么?DoubleStream的sum方法将执行多少次?一次或O(n)次,使用n=doubleArray.length?此代码
public double[] foo(double[] doubleArray) {
DoubleStream stream = Arrays.stream(doubleArray);
return stream.map(s -> s / stream.sum()).toArray();
}
这种方法的复杂性是什么?
DoubleStream
的sum
方法将执行多少次?一次或O(n)
次,使用n=doubleArray.length
?此代码将引发异常,因为不能多次使用同一流。一个流上只能执行一个终端操作
如果将代码更改为:
public double[] foo(double[] doubleArray) {
return Arrays.stream(doubleArray).map(s -> s / Arrays.stream(doubleArray).sum()).toArray();
}
它可以工作,但运行时间将是二次的(O(n^2)
),因为总和将被计算n
次
更好的方法是只计算一次总和:
public double[] foo(double[] doubleArray) {
double sum = Arrays.stream(doubleArray).sum();
return Arrays.stream(doubleArray).map(s -> s / sum).toArray();
}
这将以线性时间运行。这仍将失败。。。您需要再次从source@Eugene你可以提到它,也可以像我一样写
线性时间。它是n、2n还是cn都没有关系。都是线性时间。