【问题标题】: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
    

    所以最后的答案是假的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多