0

我正在使用 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");
  }
}

但我听说有时使用 Atomic Object 会影响性能。是否有任何替代方法可以使用 Java 8 使用 forEach 块之外的变量?如果没有这个,作为变量的错误应该是最终或有效的最终错误。

请帮我解决这个问题。

提前致谢。

4

2 回答 2

0

如果有任何名称不为空,您可以通过使用 lambda 表达式返回 true 或 false 来避免该问题,并将结果分配给您的布尔值。

像这样的东西:

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

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

编辑:

  • 将 Boolean 替换为每个评论的基本类型。
  • 每个评论使用 anyMatch() 而不是 filter() 计数谢谢
于 2021-08-18T03:56:58.187 回答
-1

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

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

关于 using 的开销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 并直接放入 anyMatch 的结果来避免这种情况。

于 2021-08-18T04:16:56.773 回答