java - 什么时候不使用 java8 流?

标签 java arrays java-8 java-stream

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

2年前关闭。




Improve this question




我只是在尝试一些代码片段,发现与使用 java 8 流相比,使用简单的 for 循环给了我更好的性能结果。现在,我可能在理解这些事情时遗漏了一些东西。我需要帮助理解差异。在下面添加我的代码。

//Following takes almost 3ms

public int[] testPerf(int[] nums, int[] index) {
    List<Integer> arrayL = new ArrayList<>();
    for(int i =0; i< index.length; i++){
        arrayL.add(index[i], nums[i]);
    }
    return arrayL.stream().mapToInt(i -> i).toArray();
}

//Following takes almost 1ms

public int[] testPerf(int[] nums, int[] index) {
    List<Integer> arrayL = new ArrayList<>();
    for(int i =0; i< index.length; i++){
        arrayL.add(index[i], nums[i]);
    }
    int [] result = new int[index.length];
    for(int i =0; i< index.length; i++){
        result[i] = arrayL.get(i);
    }
    return result;
}

编辑:开始

我想测试什么?在索引数组指定的索引处注入(inject) nums 的元素以形成最终结果。
Input: nums = [0,1,2,3,4], index = [0,1,2,2,1]
Output: [0,4,1,3,2]
Explanation:
nums       index     target
0            0        [0]
1            1        [0,1]
2            2        [0,1,2]
3            2        [0,1,3,2]
4            1        [0,4,1,3,2]

编辑:结束

请注意,我已经用不同的输入测试了这些,并尝试了包含 2k+ 元素的数组,但带有 for 循环的代码仍然给了我更好的性能。

请指导是什么使其他代码花费更多时间?
还要指出我可以学习何时不使用 java 流的任何引用资料? (什么时候不要过于复杂?:))

最佳答案

如果可以,我会在循环上使用流(我在循环上使用任何东西),因为
流通常更容易编写而没有错误,即使在没有测试的情况下,因为它们的声明性统一语法。出于同样的原因,对于非作者来说,它们通常更容易阅读,即使没有彻底的评论。此外,流是惰性的(想想“拉”),for 循环是急切的(想想“推”)。懒惰通常更好。

不幸的是,流有(有时是大量的)开销,因此在编写性能关键代码时需要注意,尤其是收集器。

因此,类似于“尽可能使用流并在必须的地方循环”之类的东西。

关于java - 什么时候不使用 java8 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61158403/

相关文章:

javascript - 如何在 MongoDB 的多个嵌套数组中插入和查找对象?

java Stream map和mapToObj的区别

Java 8 Lambda 函数抛出异常?

java - 如何使用 Java 流重新组合树状图

java - 从 spring-boot 环境获取属性映射

java - filename.delete() 在 JAVA 中给出 false

java - Java 中的游程编码图像压缩

java - 解析数据表信息并在java中使用它的通用方法是什么

mysql - Bash - 在 Ubuntu 18 中从 mysql-client 解析中分割字符串的问题

c# - 在 C# 中以最少的步骤重新排序元素集合