谓词与if语句

时间:2017-03-16 09:28:01

标签: java if-statement lambda java-8 predicate

我在一些项目中看到人们使用Predicate而不是纯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");
    }

在if语句中更喜欢Predicate更重要的是什么?

3 个答案:

答案 0 :(得分:15)

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

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

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

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

这是filter Stream方法的工作原理。

答案 1 :(得分:14)

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

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

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

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

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

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

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

答案 2 :(得分:0)

使用if语句是检查二进制条件的最佳方法(读取:性能最佳)。

对于更复杂的情况,switch语句可能更快。

PredicateFunction的特殊形式。事实上,java语言架构师的工作方式是允许泛型基元类型。这将使Predicate<T>大致相当于Function<T, boolean>(以测试与应用方法名称为模)。

如果函数(resp。方法)将一个或多个函数作为参数,我们将其称为高阶函数。我们说我们正在将行为传递给一个函数。这使我们能够创建强大的API。

String result = Match(arg).of(
        Case(isIn("-h", "--help"),    help()),
        Case(isIn("-v", "--version"), version()),
        Case($(),                     cmd -> "unknown command: " + cmd)
);

此示例取自Javaslang,这是一个用于Java 8 +中对象函数编程的库。

免责声明:我是Javaslang的创作者。