java - Predicates Java 8 的含义和用法

标签 java lambda java-8 predicate functional-interface

我正在学习函数式接口(interface)、lambda 表达式和谓词的概念。我可以使用互联网上的示例编写程序,但我仍然不清楚某些结构。

这是我的课Employee具有 3 个数据成员、一个构造函数和相应的 setter 和 getter。

package lambdaandrelated;

public class Employee {

    private String name;

    private String gender;

    private int age;

    public Employee(String name, String gender, int age) {
        super();
        this.name = name;
        this.gender = gender;
        this.age = age;
    }



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

这是另一个有 3 个检查方法的类:

一个。雇员是否为男性。 b.雇员是否为女性。 C。雇员的年龄是否大于过去的年龄。

package lambdaandrelated;

import java.util.function.Predicate;

    public class EmployeePredicates {

        public static Predicate<Employee> isMale(){
            return emp -> emp.getGender().equalsIgnoreCase("Male");  - **Line 1**
        }

        public static Predicate<Employee> isFemale(){
            return emp -> emp.getGender().equalsIgnoreCase("Female");
        }

        public Predicate<Employee> isGreaterThan(Integer age){
            return emp -> emp.getAge()>age;
        }
    }

这是我的主课:

package lambdaandrelated;

import java.util.function.Predicate;

public class EmployeeMain {

    public static void main(String[] args) {
        Employee emp1 = new Employee("Parul", "Female", 24);
        Employee emp2 = new Employee("Kanika", "Female", 24);
        Employee emp3 = new Employee("Sumit", "Male", 27);


        Predicate<Employee> predicate1 = new EmployeePredicates().isGreaterThan(23);
        System.out.println(predicate1);  **Line2**
        boolean value = predicate1.test(emp3);
        System.out.println(value);

        boolean value1 = predicate1.negate().test(emp3);  **Line3**
        System.out.println(value1);

        System.out.println(predicate1.negate()); **Line4**



    }
}

我的疑问:

1) 第 1 行是 test() 的实现吗? Predicate的方法|界面?如果是,为什么方法的返回类型是isMale()一个Predicate<Employee>而不是 boolean

2) 第 2 行的 o/p,即变量“predicate1”的值为“lambdaandrelated.EmployeePredicates$$Lambda$1/746292446@4617c264”。但是变量 'predicate1' 的类型是 Predicate<Employee> .这里的背景发生了什么?

3) Predicate 的否定是什么意思?如果这意味着否定 boolean o/p,那么它不应该应用于test()的o/p吗?方法而不是将其应用于谓词本身(如第 3 行中所做的那样)。如果这意味着否定 Predicate对象,那么为什么以及如何是 test() 的 o/p方法被否定?在改变 boolean 的背景中发生了什么来自 true 的值至 false .是返回的谓词对象的类型决定了 test() 方法的 o/p 吗?

4)当negate()的返回类型时,Line4的o/p也是“java.util.function.Predicate$$Lambda$2/2055281021@5ca881b5”也是Predicate<T>这看起来不错。那为什么isMale()的o/p/isFemale()格式不一样?

最佳答案

  1. isMale()是一种返回 Predicate<Employee> 的方法,这是一个功能接口(interface),具有接受 Employee 的单一方法。并返回 boolean .

    该方法不会返回给定 Employee 的 boolean 值.它返回一个可以应用于任何 Employee 的函数并返回一个 boolean 值。

  2. 打印引用变量时,您会看到该变量引用的对象的运行时类型,而不是其编译时类型(当然,这是假设运行时类型未覆盖 toString ) . lambda 表达式是一种实现功能接口(interface)的方法。如果您使用某个类显式实现了接口(interface) Predicate<Employee> predicate1 = new ClassThatImplementsPrdicateEmployee() , 印花 predicate1会给你那个类(class)的名字ClassThatImplementsPrdicateEmployee而不是 Predicate .同样,对于 lambda 表达式,编译器生成返回的名称,类似于匿名类实例的情况。

  3. 至于negate的作用,看默认实现:

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }
    

    它返回一个 Predicate其实现是对应用原始 Predicate 的否定的 test()给定参数的方法。

关于java - Predicates Java 8 的含义和用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44177985/

相关文章:

java-8 - Java 版本显示 7 而 Java 版本在 windows 中显示 8?

java - 使用 Java 删除 SQLite 数据库文件不起作用

java - Payara服务器启动异常

java - 我似乎无法让 Java 读取我的文本文档

c# - 并行化作业的更好方法

java 。 lambda 中预期的数组类型

java - 在 Java 8 中将实例方法作为参数传递

eclipse - 我收到 “package javafx.geometry does not exist”错误,使用gradle进行编译

java - 使用转换器时,如何将 header 添加到 spark 的响应中

java - nativeAddLocalStream 中的 Android WebRTC SIGSEGV