了解Lambda和/或谓词

时间:2018-12-07 09:40:27

标签: java lambda java-8 predicate functional-interface

我是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-错误:错误

3 个答案:

答案 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方法,它都会原样返回


然后您可以关联调用匿名类的每个实例testtest1方法test2的方式输出。

答案 1 :(得分:3)

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

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

所以最终答案将是错误的。