了解 lambdas and/or 谓词
Understanding lambdas and/or predicates
我是 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 - false: true
test2 - true: true
test2 - false: false
这是错误的,因为 p
是 false
而 1==1
是 true
所以:
false == true
计算结果为 false。
换句话说,当您使用 false
作为参数调用此函数时:
Predicate<Boolean> test2 = p -> p == (1==1);
可以看成:
Predicate<Boolean> test2 = p -> false == (1==1);
顺便说一句,上面的谓词将 return 无论你传递给它什么输入,所以本质上它是:
Predicate<Boolean> test2 = p -> p;
谓词 test1 = 值 -> 1 == 1;
谓词 test2 = 值 -> 值 == (1==1);
测试用例 : System.out.println("test2 - false: "+test2.test(false));
输出:假
解释:
您正在使用 "false" 调用 test2 方法,因此您的方法的执行将是这样的:
false == (1==1) => false == true => false
所以最后的答案是假的。
详细说明
你的第一个 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
方法传递什么值,它都会 始终 return 只为真 .
另一方面,第二个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'
}
};
因此,无论您传递给上述 test
方法的 boolean
值是什么,它 都将按原样 return 编辑。
然后您可以关联如何调用匿名 类 的每个实例 test1
和 test2
对应的 方法 test
以及可能的输出是什么。
我是 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 - false: true
test2 - true: true
test2 - false: false
这是错误的,因为 p
是 false
而 1==1
是 true
所以:
false == true
计算结果为 false。
换句话说,当您使用 false
作为参数调用此函数时:
Predicate<Boolean> test2 = p -> p == (1==1);
可以看成:
Predicate<Boolean> test2 = p -> false == (1==1);
顺便说一句,上面的谓词将 return 无论你传递给它什么输入,所以本质上它是:
Predicate<Boolean> test2 = p -> p;
谓词 test1 = 值 -> 1 == 1;
谓词 test2 = 值 -> 值 == (1==1);
测试用例 : System.out.println("test2 - false: "+test2.test(false));
输出:假
解释:
您正在使用 "false" 调用 test2 方法,因此您的方法的执行将是这样的:
false == (1==1) => false == true => false
所以最后的答案是假的。
详细说明
你的第一个 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
方法传递什么值,它都会 始终 return 只为真 .
另一方面,第二个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'
}
};
因此,无论您传递给上述 test
方法的 boolean
值是什么,它 都将按原样 return 编辑。
然后您可以关联如何调用匿名 类 的每个实例 test1
和 test2
对应的 方法 test
以及可能的输出是什么。