Java 8 lambda表达式求值

Aub*_*ron 4 java java-8 java-stream

我有一个类似于以下方法:

public double[] foo(double[] doubleArray) { 
    DoubleStream stream = Arrays.stream(doubleArray);

    return stream.map(s -> s / stream.sum()).toArray();
}
Run Code Online (Sandbox Code Playgroud)

这种方法的复杂性是什么?多少次会DoubleStreamsum方法被执行?一次或O(n)多次,有n = doubleArray.length

Era*_*ran 7

此代码将引发异常,因为您不能多次使用相同的Stream.您只能在Stream上执行一个终端操作.

如果您将代码更改为:

public double[] foo(double[] doubleArray) { 
    return Arrays.stream(doubleArray).map(s -> s / Arrays.stream(doubleArray).sum()).toArray();
}
Run Code Online (Sandbox Code Playgroud)

它会工作,但运行时间将是二次(O(n^2)),因为总和将计算n时间.

更好的方法是只计算一次总和:

public double[] foo(double[] doubleArray) { 
    double sum = Arrays.stream(doubleArray).sum();
    return Arrays.stream(doubleArray).map(s -> s / sum).toArray();
}
Run Code Online (Sandbox Code Playgroud)

这将以线性时间运行.

  • @Eugene你可以提一下,或者你可以像我一样写"线性时间".它是n还是2n或cn并不重要.都是线性时间. (2认同)