Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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
使用Java8的方法引用_Java_Lambda_Java 8_Method Reference - Fatal编程技术网

使用Java8的方法引用

使用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

我使用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 = 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);
}