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的结果放上来避免。
我正在使用 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的结果放上来避免。