了解 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

这是错误的,因为 pfalse1==1true 所以:

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 编辑


然后您可以关联如何调用匿名 类 的每个实例 test1test2 对应的 方法 test 以及可能的输出是什么。