Java 8 lambda 表达式求值

标签 java java-8 java-stream

我有一个类似于下面的方法:

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

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

这个方法的复杂度是多少? DoubleStreamsum方法会被执行多少次?一次或 O(n) 次,n = doubleArray.length?

最佳答案

此代码将引发异常,因为您不能多次使用同一个 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();
}

这将以线性时间运行。

关于Java 8 lambda 表达式求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45433109/

相关文章:

java - 有没有一种紧凑的方法可以在 Java 中对二进制文字数据进行编码?

java - Android-如何让 ScrollView 占据屏幕的整个宽度?

java - 如何对 n 个散列图使用 java 8 合并函数

java - 数组类在 Java 中如何工作?

java - 在构造函数中将字符串解析为 Json

java - Taglib 显示 java.time.LocalDate 格式化

JAVA不断向线程池提交任务并在没有更多任务执行时关闭线程池?

java - 是否可以通过.forEach方法列出文件特征?

java - 如何模拟使用供应商创建并使用两次的流?

java - 使用 Java 8 过滤流后收集