关闭。这个问题是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/