java 8消费者赢得';不要覆盖一个值 私有字符串a; 私有布尔bBoolean=false; 私有字符串tmp(布尔aBoolean、布尔bBoolean、使用者){ if(aBoolean==null){ 返回“-”; } consumer.accept(aBoolean);//do bBoolean=aBoolean; 返回bBoolean?“是”:“否”; } 公共静态void main(字符串[]args){ Main Main=新Main(); main.a=main.tmp(true,main.bBoolean,c->main.bBoolean=c); System.out.println(main.a); System.out.println(main.bBoolean); }
对于java 8消费者赢得';不要覆盖一个值 私有字符串a; 私有布尔bBoolean=false; 私有字符串tmp(布尔aBoolean、布尔bBoolean、使用者){ if(aBoolean==null){ 返回“-”; } consumer.accept(aBoolean);//do bBoolean=aBoolean; 返回bBoolean?“是”:“否”; } 公共静态void main(字符串[]args){ Main Main=新Main(); main.a=main.tmp(true,main.bBoolean,c->main.bBoolean=c); System.out.println(main.a); System.out.println(main.bBoolean); },java,java-8,Java,Java 8,对于main.bBoolean而言,输出为true,对于main.a而言,输出为no 怎么可能呢?您正在将main.bBoolean的副本传递给tmp,而其值仍然是false consumer.accept(aBoolean)将true分配给this.bBoolean(因为aBoolean是true),但局部变量bBoolean保持false。因此,tmp方法返回“no” 如果您更改: private String a; private Boolean bBoolean = false; pr
main.bBoolean
而言,输出为true
,对于main.a
而言,输出为no
怎么可能呢?您正在将
main.bBoolean
的副本传递给tmp
,而其值仍然是false
consumer.accept(aBoolean)
将true
分配给this.bBoolean
(因为aBoolean
是true
),但局部变量bBoolean
保持false
。因此,tmp
方法返回“no”
如果您更改:
private String a;
private Boolean bBoolean = false;
private String tmp(Boolean aBoolean, Boolean bBoolean, Consumer<Boolean> consumer){
if (aBoolean == null) {
return "-";
}
consumer.accept(aBoolean); // do bBoolean = aBoolean;
return bBoolean ? "yes" : "no";
}
public static void main(String[] args) {
Main main = new Main();
main.a = main.tmp(true, main.bBoolean, c -> main.bBoolean = c);
System.out.println(main.a);
System.out.println(main.bBoolean);
}
致:
您将得到“yes”,这意味着调用
使用者的accept
方法
确实更改了实例变量main.bBoolean
我尝试使方法的参数名与实际字段不同,除了构造函数
如果情况并非如此,则必须格外小心,以确保本地参数的使用不会与实际字段混淆
return this.bBoolean ? "yes" : "no";
私有字符串tmp(布尔aParam、布尔bParam、使用者){
if(aParam==null){
返回“-”;
}
consumer.accept(aParam);//do bBoolean=aBoolean;
//检查实例字段,而不是参数
返回bBoolean?“是”:“否”;
}
这比原来的更容易推理和阅读。
目的是明确的,万一出现问题,也更容易调试 请删除所有不必要的代码,这样您就可以得到最小的工作示例,从中您将很容易看到您正在做什么。有许多事情对您的输出没有任何影响。在同一个类中混合使用静态调用和非静态调用也会造成混淆。如果除了
true
或false
之外,您从未将变量声明为Boolean
。也许它在其他地方对你的程序有一些意义,但是在StackOverflow上,如果你去掉所有的绒毛,效果会更好。
return this.bBoolean ? "yes" : "no";
private String tmp(Boolean aParam, Boolean bParam, Consumer<Boolean> consumer){
if (aParam == null) {
return "-";
}
consumer.accept(aParam); // do bBoolean = aBoolean;
//check the instance field and not the param
return bBoolean ? "yes" : "no";
}