Java 谓词vs if语句
我在一些项目中看到,人们使用Java 谓词vs if语句,java,if-statement,lambda,java-8,predicate,Java,If Statement,Lambda,Java 8,Predicate,我在一些项目中看到,人们使用谓词s而不是纯if语句,如下一个简单示例所示: int i = 5; // Option 1 if (i == 5) { // Do something System.out.println("if statement"); } // Option 2 Predicate<Integer> predicate = integer -> integer == 5;
谓词
s而不是纯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");
}
inti=5;
//选择1
如果(i==5){
//做点什么
System.out.println(“if语句”);
}
//选择2
谓词=整数->整数==5;
if(谓词测试(i)){
//做点什么
System.out.println(“谓词”);
}
与if语句相比,使用
谓词
s有什么意义?使用谓词可以使代码更灵活
与编写总是检查i==5
的条件不同,您可以编写一个对谓词
求值的条件,该条件允许您传递实现不同条件的不同谓词
例如,谓词
可以作为参数传递给方法:
public void someMethod (Predicate<Integer> predicate) {
if(predicate.test(i)) {
// do something
System.out.println("predicate");
}
...
}
公共void方法(谓词){
if(谓词测试(i)){
//做点什么
System.out.println(“谓词”);
}
...
}
这就是
Stream
的filter
方法的工作原理。对于您提供的确切的示例,使用谓词是一个巨大的过度杀伤力。编译器和运行时将创建:
Predicate<Integer> p = (Integer j) -> this.isJGood(j); // you are capturing "this"
谓词p=(整数j)->this.isJGood(j);//您正在捕获“此”
然后每次使用该谓词时,都会创建一个新实例(至少在当前JVM下)
当然,创建这样一个谓词的唯一可行方法是在多个位置重复使用它(比如将其作为参数传递给方法)。使用if语句是检查二进制条件的最佳(读:性能最好)方法 对于更复杂的情况,switch语句可能更快
谓词
是函数
的一种特殊形式。事实上,java语言架构师正在研究一种允许泛型基元类型的方法。这将使谓词
大致等同于函数
(将测试与应用方法名称进行模块化)
如果一个函数(resp.method)将一个或多个函数作为参数,我们称之为高阶函数。我们说我们正在将行为传递给函数。这使我们能够创建功能强大的API
String result = Match(arg).of(
Case(isIn("-h", "--help"), help()),
Case(isIn("-v", "--version"), version()),
Case($(), cmd -> "unknown command: " + cmd)
);
此示例取自Java 8+中的对象函数式编程库
免责声明:我是Javaslang的创建者。当您想要重用谓词时,这非常有用。举个例子:如果要将特定筛选器应用于不同的
列表
s,该怎么办?如果要更改特定的筛选器,该怎么办?使用谓词是一种很好的方法,可以避免您不得不在一行中的100个位置更改代码。例如,您给出的示例中,谓词是完全不必要的,只会毫无理由地使事情变得更复杂。从技术上讲,这两种用法都使用if语句。谓词是一个生成变量条件的功能接口,通过它,您可以在逻辑中测试这些变量条件。投票重新打开。这个问题的范围并不太广,到目前为止,它已经吸引了一些不错的高质量的答案。然而,如果您不需要这种灵活性,那么您不应该使用谓词
。当然,在适当的情况下,它是一个很好的工具,但是如果按照OP的示例使用,它会使代码复杂化。@cmaster确实如此。