使用Java8的方法引用
我使用Java8中支持的谓词,在Java8中我使用lambdas,但是我想使用方法引用来代替lambdas。请告知如何实现这一目标。下面是我的代码使用Java8的方法引用,java,lambda,java-8,method-reference,Java,Lambda,Java 8,Method Reference,我使用Java8中支持的谓词,在Java8中我使用lambdas,但是我想使用方法引用来代替lambdas。请告知如何实现这一目标。下面是我的代码 public class Employee { public Employee(Integer id, Integer age, String gender, String fName, String lName){ this.id = id; this.age = age; this.gender
public class Employee {
public Employee(Integer id, Integer age, String gender, String fName, String lName){
this.id = id;
this.age = age;
this.gender = gender;
this.firstName = fName;
this.lastName = lName;
}
private Integer id;
private Integer age;
private String gender;
private String firstName;
private String lastName;
//Please generate Getter and Setters
@Override
public String toString() {
return this.id.toString()+" - "+this.age.toString(); //To change body of generated methods, choose Tools | Templates.
}
在这里,我将谓词与lambdas一起使用,我希望删除lambdas并使用方法引用:
public class EmployeePredicates
{
public static Predicate<Employee> isAdultMale() {
return p -> p.getAge() > 21 && p.getGender().equalsIgnoreCase("M");
}
public static Predicate<Employee> isAdultFemale() {
return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F");
}
public static Predicate<Employee> isAgeMoreThan(Integer age) {
return p -> p.getAge() > age;
}
public static List<Employee> filterEmployees (List<Employee> employees, Predicate<Employee> predicate) {
return employees.stream().filter( predicate ).collect(Collectors.<Employee>toList());
}
}
public class EmployeePredicates
{
公共静态谓词isadaltmale(){
返回p->p.getAge()>21&&p.getGender().equalsIgnoreCase(“M”);
}
公共静态谓词isAdultFemale(){
返回p->p.getAge()>18&&p.getGender().equalsIgnoreCase(“F”);
}
公共静态谓词isAgeMoreThan(整数年龄){
返回p->p.getAge()>age;
}
公共静态列表筛选器员工(列表员工,谓词){
return employees.stream().filter(谓词).collect(收集器.toList());
}
}
我需要用“方法引用语法”重写您的代码片段,以向您展示它们在这里使用的所有古怪和不正确之处。求你了,别这样
public static Predicate<Employee> isAdultMale() {
return e -> ((Predicate<Employee>)EmployeePredicates::isAgeMoreThan21).test(e) && ((Predicate<Employee>)EmployeePredicates::isMale).test(e);
}
private static boolean isAgeMoreThan21(Employee employee) {
return employee.getAge() > 21;
}
private static boolean isMale(Employee employee) {
return employee.getGender().equalsIgnoreCase("M");
}
如果你没有一个方法可以做你想做的事情,你希望如何使用方法引用?不清楚您试图实现什么,或者为什么。@Jon Skeet请告知我如何使用方法引用代替lambda。如果lambda的主体只调用一个方法,您只能用方法引用替换lambda。您的谓词不适用,因为它们有其他内容,例如>。如果您使用的是一个好的IDE(例如IntelliJ),它会告诉您什么时候可以用方法引用替换lambda。当它发生时,我会担心的。@cpp初学者是,这在eclipse中也是可能的also@user1620642您也可以在eclipse中执行此操作(lambda符号上的ctrl+1)代码>
public static Predicate<Employee> isAdultMale() {
return ((Predicate <Employee>)EmployeePredicates::isAgeMoreThan21).and(EmployeePredicates::isMale);
}