理解lambdas和/或谓词

tis*_*sen 5 java lambda predicate java-8 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));
}
Run Code Online (Sandbox Code Playgroud)

输出:

test1 - true:true

test1 - false:true

test2 - true:true

test2 - false:false

Nam*_*man 7

你的第一个Predicate

Predicate<Boolean> test1 = p -> 1 == 1;
Run Code Online (Sandbox Code Playgroud)

可以表示为

Predicate<Boolean> test1 = new Predicate<Boolean>() {
    @Override
    public boolean test(Boolean p) {
        return true; // since 1==1 would ways be 'true'
    }
};
Run Code Online (Sandbox Code Playgroud)

因此无论您传递给上述test方法的值是什么,它总是只返回true.

另一方面,第二个Predicate

Predicate<Boolean> test2 = p -> p == (1==1);
Run Code Online (Sandbox Code Playgroud)

可以表示为

Predicate<Boolean> test2 = new Predicate<Boolean>() {
    @Override
    public boolean test(Boolean p) {
        return p; // since 'p == true' would effectively be 'p'
    }
};
Run Code Online (Sandbox Code Playgroud)

因此,无论boolean您传递给上述test方法的任何值,它都将按原样返回.


然后你就可以如何相互关联的方法test对应于每个实例test1test2匿名类的调用,哪些应是可能的输出.

  • 我喜欢这个细节,最有用:-) (3认同)