Java 8 lambda表达式求值

时间:2017-08-01 08:47:53

标签: 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

1 个答案:

答案 0 :(得分:7)

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

如果您将代码更改为:

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();
}

这将以线性时间运行。