谓词与if语句

poy*_*ger 15 java lambda if-statement predicate java-8

我在一些项目中看到人们使用Predicates而不是纯if语句,如下面的一个简单示例所示:

    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");
    }
Run Code Online (Sandbox Code Playgroud)

更喜欢Predicate陈述的重点是什么?

Eug*_*ene 18

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

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

所有这些与简单的if语句相对.

所有这一切都是针对无国籍的谓词.如果您的谓词是有状态的,例如:

 Predicate<Integer> p = (Integer j) -> this.isJGood(j); // you are capturing "this"
Run Code Online (Sandbox Code Playgroud)

然后每次使用此谓词时,都会创建一个新实例(至少在当前的JVM下).

当然,IMO创建这样一个谓词的唯一可行选择是在多个地方重用它(比如作为方法的参数传递).


Era*_*ran 17

使用谓词可以使您的代码更加灵活.

i == 5您可以编写一个评估a的条件,而不是编写始终检查的条件Predicate,这样就可以传递不同Predicate的条件来实现不同的条件.

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

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

这是如何工作的filter方法Stream.

  • 然而,如果你不需要那种灵活性,你就不应该使用`Predicate <>`.当然,它是一个很好的工具,但如果按照OP的例子使用它会使代码复杂化. (5认同)
  • @cmaster确实是这样。 (2认同)