我在一些项目中看到人们使用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
更重要的是什么?
答案 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)
对于您提供的完全示例,使用谓词是一个很大的过度杀戮。编译器然后运行时将创建:
- 一种方法(脱糖谓词)
- 将实现java.util.Predicate
的.class- 在2
创建的类的实例 醇>
所有这些与简单的if语句相对应。
所有这些都是无状态谓词。如果您的谓词是有状态的,例如:
Predicate<Integer> p = (Integer j) -> this.isJGood(j); // you are capturing "this"
然后每次使用此谓词时,都会创建一个新实例(至少在当前的JVM下)。
IMO创建这样一个谓词的唯一可行选择当然是在多个地方重用它(比如作为方法的参数传递)。
答案 2 :(得分:0)
使用if语句是检查二进制条件的最佳方法(读取:性能最佳)。
对于更复杂的情况,switch语句可能更快。
Predicate
是Function
的特殊形式。事实上,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的创作者。