修改列表-流方法

时间:2019-02-06 15:21:04

标签: java performance arraylist functional-programming java-stream

我想修改流中已创建对象的列表。我意识到可以使用三种方法来做到这一点,但是我不确定它们的性能以及是否可能缩小尺寸。

  1. 返回相同的对象-创建新对象不会浪费时间,但是对象是可变的
  2. 创建新对象-参数未修改,但是创建大量对象非常耗时
  3. 修改参数-只能使用ForEach,不能并行使用

下面的代码带有解释性注释。

// In your actual code this value would be set from CSV
set valueFromCSV to "purple"

set buttonToClick to valueFromCSV & "Button.png"

click buttonToClick

所以问题是哪种方法最有效?

编辑: 用流方法,我的意思是,从性能上讲,这是最大的优势。

EDIT2:  1.哪个是功能方法?  2.在性能方面哪个最好?

2 个答案:

答案 0 :(得分:2)

javadoc指出Streams应该避免副作用:

  

通常不鼓励流操作的行为参数产生副作用,因为它们经常会导致无意识地违反无状态要求以及其他线程安全危害。

因此,您应该更喜欢创建新对象而不是修改现有对象的解决方案。

答案 1 :(得分:1)

在您的情况下,不同的方法很可能会导致性能方面的差异。

原因:优化。 Java不会真正创建新的类,而是将直接使用字段。它甚至可能会(如果分析认为很重要)甚至会跳过整个调用链,并用预先计算的值替换它。 Java运行时甚至利用探查器来优化和查找热点...

也:关于性能,通常(特定情况可能有所不同)更重要的是创建一个简单的结构并帮助运行时做出正确的假设。 因此,如果您在简单的手动“优化”中隐藏了正在执行的操作,则在运行时中隐藏了优化可能性(许多分支/决策,不必要的固定,“未知”方法的链...),结果可能会变慢

为清楚起见和副作用(另请参见其他答案),我宁愿使用创建新实例的版本。