Java 8 变量应该是最终的或有效的最终问题

Java 8 variable should be final or effectively final issue

我正在使用 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 表达式来避免此问题 return 如果有任何名称不为空,则为真或假,并将结果分配给您的布尔值。

像这样:

boolean hasAnyWithNames = list.stream().anyMatch(c -> c.getName() != null);

顺便说一下,选择“bool”不是一个好的变量名。

编辑:

  • 根据评论将布尔值替换为基本类型。
  • 每个评论使用 anyMatch() 而不是 filter() 计数 谢谢

有效的最终限制仅适用于局部变量。
由于您正在设置实例字段,因此您可以简单地使用: boolean bool = true; 并从 lambda 中设置它。

如果需要使用局部变量,在声明中添加final修饰符。

关于使用 AtomicBoolean 的开销,请记住流也有开销,如果您仅将它们用于迭代,您最好改用 for 循环:

boolean bool = true;

    public void testBool(){
        for (var c : list) {
            if (c.getName() != null) {
                bool = true;
                break;
            }
        }
    }

最后,正如@Neela 在评论中提到的,使用以下代码可以更有效地使用流*:

boolean bool = list.stream().anyMatch(c -> c.getName() != null);

*注意,原代码有一个错误,导致bool一直为true,通过不预设为true,直接把anyMatch的结果放上来避免。