我正在学习函数式接口(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()
格式不一样?
最佳答案
isMale()
是一种返回Predicate<Employee>
的方法,这是一个功能接口(interface),具有接受Employee
的单一方法。并返回boolean
.该方法不会返回给定
Employee
的 boolean 值.它返回一个可以应用于任何Employee
的函数并返回一个 boolean 值。打印引用变量时,您会看到该变量引用的对象的运行时类型,而不是其编译时类型(当然,这是假设运行时类型未覆盖
toString
) . lambda 表达式是一种实现功能接口(interface)的方法。如果您使用某个类显式实现了接口(interface)Predicate<Employee> predicate1 = new ClassThatImplementsPrdicateEmployee()
, 印花predicate1
会给你那个类(class)的名字ClassThatImplementsPrdicateEmployee
而不是Predicate
.同样,对于 lambda 表达式,编译器生成返回的名称,类似于匿名类实例的情况。至于negate的作用,看默认实现:
default Predicate<T> negate() { return (t) -> !test(t); }
它返回一个
Predicate
其实现是对应用原始Predicate
的否定的test()
给定参数的方法。
关于java - Predicates Java 8 的含义和用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44177985/