【发布时间】:2021-08-18 03:25:27
【问题描述】:
我正在使用 Java 8 流迭代和一个也应该在其他类中使用的变量。所以我使用了下面的代码。
AtomicBoolean bool = new AtomicBoolean(true);
public void testBool(){
list.stream().forEach(c->{
if( c.getName() != null){
bool.set(true);
}
});
}
public void test(){
if(bool.get()){
System.out.println("value is there");
}
}
但我听说使用原子对象有时会影响性能。是否有任何替代方法可以使用 Java 8 使用 forEach 块之外的变量? 如果没有这个,我会得到错误,因为变量应该是最终或有效的最终错误。
请帮我解决这个问题。
提前致谢。
【问题讨论】:
-
您在 lambda 函数中编写的所有代码都必须是
functional这意味着:在 lambda 函数中执行的任何代码都不应该对其他任何地方产生影响。您的代码对变量bool有这种影响,这就是它阻止它做同样事情的原因。请使用不同的逻辑,例如:list.stream().any( c -> c.getName != null ) -
duplicate link 中最受好评的三个答案应该可以为您提供足够的信息。
-
使用
AtomicBoolean的“性能”影响非常小,几乎无法衡量。但是,使用在不需要时迭代每个元素的流而不是使用在找到第一个getName != null时提前退出的简单循环对性能的影响非常大,即使大小非常适中也很容易测量列表。 -
有效最终限制仅适用于局部变量。因为您正在设置一个实例字段,所以您可以简单地使用:
boolean bool = true;并在 lambda 中进行设置。
标签: java java-8 java-stream atomicinteger atomic-values