我是Java 8的新手,我想为最后一次测试错误的原因做个准备。
@Test
public void predicateTest() {
Predicate<Boolean> test1 = p -> 1 == 1;
Predicate<Boolean> test2 = p -> p == (1==1);
System.out.println("test1 - true: "+test1.test(true));
System.out.println("test1 - false: "+test1.test(false));
System.out.println("test2 - true: "+test2.test(true));
System.out.println("test2 - false: "+test2.test(false));
}
输出 :
test1-true: true
test1-否: true
test2-true: true
test2-错误:错误
答案 0 :(得分:7)
您的第一个Predicate
即
Predicate<Boolean> test1 = p -> 1 == 1;
可以表示为
Predicate<Boolean> test1 = new Predicate<Boolean>() {
@Override
public boolean test(Boolean p) {
return true; // since 1==1 would ways be 'true'
}
};
因此,不管您为上述test
方法传递什么值,它都会始终仅返回true 。
另一方面,第二个Predicate
即
Predicate<Boolean> test2 = p -> p == (1==1);
可以表示为
Predicate<Boolean> test2 = new Predicate<Boolean>() {
@Override
public boolean test(Boolean p) {
return p; // since 'p == true' would effectively be 'p'
}
};
因此,无论将什么boolean
值传递给上述test
方法,它都会原样返回。
然后您可以关联调用匿名类的每个实例test
和test1
的方法test2
和的方式输出。
答案 1 :(得分:3)
这是错误的,因为p
是false
,而1==1
是true
,所以:
false == true
的计算结果为false。
换句话说,当您使用false
作为参数调用此函数时:
Predicate<Boolean> test2 = p -> p == (1==1);
它可以看作是:
Predicate<Boolean> test2 = p -> false == (1==1);
上面的谓词将返回您传递给它的任何输入,因此本质上是:
Predicate<Boolean> test2 = p -> p;
答案 2 :(得分:2)
谓词test1 =值-> 1 == 1;
谓词test2 =值->值==(1 == 1);
测试用例:System.out.println(“ test2-false:” + test2.test(false));
输出:否
说明:
您正在使用“ false”调用test2方法,因此您方法的执行将如下所示:
false == (1==1) => false == true => false
所以最终答案将是错误的。