Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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";
}