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都没有关系。都是线性时间。