lambda简化几个比较器的相关的问题

创建父类与子类, staff 为父类,测试类添加职员, TEACHER ,校长,保安多个实例,编写以下这几个方法 private static void printName ( Staff ] staffs )打印出每个人的名字 private static void printSalary ( Staff [] staffs )打印出 Staff 类或者其子类对象的薪水,支持对 Staff 类及其子类按照各自的薪水降序排序; private static void
sortByAge ( Staff ]] staffs ),对 Staff 对象按照年龄升序排序,再编写一个方法按 name 升序进行排序; sortByDateHired ,支持对 Staff 类及其子类按照各自的 dateHired 升序排序,可以使用
java . util . Date 类的 getTime 方法。编写 NameComparator , AgeComparator 和 ComplexComparator 比较器。其中
ComplexComparator 为复合比较器,至少选用两个关键字来排序。使用Lambda表达式NameComparator,AgeComparator和ComplexComparator比较器。

看起来是个作业,用copilot-x chat来写了下,现在的AI是真的牛哇。下边是它的回答。我瞄了两眼,可能在printName 和 printSalary 里的Comparator没有复用NameComparator他们,是个缺陷,刚好你你自己看一看改一改,熟悉下,也不枉费作业的意义了。

以下是您所描述的类和方法的Java代码实现。请注意,由于缺少Staff类的定义,我只能使用一个简单的Staff类作为示例。您需要根据您的实际需求修改代码。

import java.util.*;

class Staff {
    private String name;
    private int age;
    private double salary;
    private Date dateHired;

    public Staff(String name, int age, double salary, Date dateHired) {
        this.name = name;
        this.age = age;
        this.salary = salary;
        this.dateHired = dateHired;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }

    public Date getDateHired() {
        return dateHired;
    }
}

class Teacher extends Staff {
    public Teacher(String name, int age, double salary, Date dateHired) {
        super(name, age, salary, dateHired);
    }
}

class Principal extends Staff {
    public Principal(String name, int age, double salary, Date dateHired) {
        super(name, age, salary, dateHired);
    }
}

class SecurityGuard extends Staff {
    public SecurityGuard(String name, int age, double salary, Date dateHired) {
        super(name, age, salary, dateHired);
    }
}

public class Test {
    public static void main(String[] args) {
        Staff[] staffs = {
                new Teacher("John", 35, 5000, new Date(2020, 1, 1)),
                new Principal("Mary", 45, 8000, new Date(2018, 1, 1)),
                new SecurityGuard("Tom", 25, 3000, new Date(2021, 1, 1))
        };

        printName(staffs);
        System.out.println();
        printSalary(staffs);
        System.out.println();
        sortByAge(staffs);
        printName(staffs);
        System.out.println();
        sortByDateHired(staffs);
        printName(staffs);
        System.out.println();
        ComplexComparator complexComparator = new ComplexComparator(new NameComparator(), new AgeComparator());
        Arrays.sort(staffs, complexComparator);
        printName(staffs);
    }

    private static void printName(Staff[] staffs) {
        for (Staff staff : staffs) {
            System.out.println(staff.getName());
        }
    }

    private static void printSalary(Staff[] staffs) {
        Arrays.sort(staffs, Comparator.comparingDouble(Staff::getSalary).reversed());
        for (Staff staff : staffs) {
            System.out.println(staff.getName() + ": " + staff.getSalary());
        }
    }

    private static void sortByAge(Staff[] staffs) {
        Arrays.sort(staffs, Comparator.comparingInt(Staff::getAge));
    }

    private static void sortByDateHired(Staff[] staffs) {
        Arrays.sort(staffs, Comparator.comparing(Staff::getDateHired));
    }

    static class NameComparator implements Comparator<Staff> {
        public int compare(Staff s1, Staff s2) {
            return s1.getName().compareTo(s2.getName());
        }
    }

    static class AgeComparator implements Comparator<Staff> {
        public int compare(Staff s1, Staff s2) {
            return Integer.compare(s1.getAge(), s2.getAge());
        }
    }

    static class ComplexComparator implements Comparator<Staff> {
        private final Comparator<Staff> cmp1;
        private final Comparator<Staff> cmp2;

        public ComplexComparator(Comparator<Staff> cmp1, Comparator<Staff> cmp2) {
            this.cmp1 = cmp1;
            this.cmp2 = cmp2;
        }

        public int compare(Staff s1, Staff s2) {
            int res = cmp1.compare(s1, s2);
            if (res != 0) {
                return res;
            }
            return cmp2.compare(s1, s2);
        }
    }
}