【问题标题】:Understanding lambdas and/or predicates了解 lambda 和/或谓词
【发布时间】:2018-12-07 09:40:26
【问题描述】:
我对 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 - 真:真
test1 - 假:真
test2 - 真:真
test2 - 假:假
【问题讨论】:
标签:
java
lambda
java-8
predicate
functional-interface
【解决方案1】:
细化
您的第一个 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'
}
};
因此,无论您将传递给上述test 方法的boolean 值如何,它都将按原样返回。
然后您可以关联方法test 对应于匿名类的每个实例test1 和test2 是如何被调用的 以及可能的输出。
【解决方案2】:
这是错误的,因为 p 是 false 而 1==1 是 true 所以:
false == true 计算结果为假。
换句话说,当您使用false 作为参数调用此函数时:
Predicate<Boolean> test2 = p -> p == (1==1);
可以这样看:
Predicate<Boolean> test2 = p -> false == (1==1);
顺便说一句,上面的谓词将返回您传递的任何输入,所以基本上它是:
Predicate<Boolean> test2 = p -> p;
【解决方案3】:
谓词 test1 = value -> 1 == 1;
谓词 test2 = value -> value == (1==1);
测试用例:System.out.println("test2 - false: "+test2.test(false));
输出:假
解释:
你正在用“false”调用 test2 方法,所以你的方法的执行将是这样的:
false == (1==1) => false == true => false
所以最后的答案是假的。