2017-08-01 64 views
4

我有以下一个类似的方法:的Java 8 Lambda表达式评价

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

    return stream.map(s -> s/stream.sum()).toArray(); 
} 

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

+3

这将仍然失败...你需要再次从源创建流 – Eugene

回答

7

此代码会抛出异常,因为您不能多次使用同一个流。您只能在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(); 
} 

这将在线性时间运行。

+2

@Eugene你可以提到它,或者你可以像我一样写'线性时间'。无论它是n还是2n或cn都没关系。所有都是线性时间。 – Eran