Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 谓词vs if语句_Java_If Statement_Lambda_Java 8_Predicate - Fatal编程技术网

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
方法的工作原理。

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

  • 方法(去糖谓词)
  • 将实现java.util.Predicate的.class
  • 在2创建的类的实例
  • 所有这些与简单的if语句相比

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

     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确实如此。