谓词与 if 语句

2022-09-01 20:35:33

我在一些项目中看到人们使用s而不是纯if语句,如下图所示:Predicate

    int i = 5;
    // Option 1
    if (i == 5) {
        // Do something
        System.out.println("if statement");
    }

    // Option 2
    Predicate<Integer> predicate = integer -> integer == 5;
    if (predicate.test(i)) {
        // Do something
        System.out.println("predicate");
    }

优先选择 s 而不是 if 语句有什么意义?Predicate


答案 1

使用谓词可使代码更加灵活。

您可以编写一个计算 a 的条件,而不是编写一个始终检查 是否的条件,该条件允许您传递不同的 实现不同条件的 s。i == 5PredicatePredicate

例如,可以作为参数传递给方法:Predicate

public void someMethod (Predicate<Integer> predicate) {
    if(predicate.test(i)) {
        // do something
        System.out.println("predicate");
    }
    ...
}

这就是方法的工作原理。filterStream


答案 2

对于您提供的确切示例,使用谓词是一个很大的过度杀戮。编译器和运行时将创建:

  1. 一种方法(去糖谓词)
  2. 一个将实现java.util.Predicate的.class
  3. 在 2 处创建的类的实例

所有这些都与简单的if语句相比。

所有这些都是针对无状态谓词的。如果您的谓词是有状态的,例如:

 Predicate<Integer> p = (Integer j) -> this.isJGood(j); // you are capturing "this"

那么每次你将使用此谓词时,都会创建一个新实例(至少在当前的JVM下)。

当然,IMO创建此类谓词的唯一可行选项是在多个位置重用它(例如作为参数传递给方法)。


推荐