加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何使用java lambda重写ValueMapper函数

发布时间:2020-12-15 08:28:12 所属栏目:Java 来源:网络整理
导读:是否有可能/正确(to)或使用lambda重写下面的内容?在这里,我为KeyMapper和ValueMapper函数提供了内联实现. public MapInteger,ListEmployee getSubordinateHighestSalEmpMapV1(ListEmployee employees) { return employees.stream() .filter(e - e.getSubord
是否有可能/正确(to)或使用lambda重写下面的内容?在这里,我为KeyMapper和ValueMapper函数提供了内联实现.

public Map<Integer,List<Employee>> getSubordinateHighestSalEmpMapV1(List<Employee> employees) {

        return employees.stream()
        .filter(e -> e.getSubordinates() != null)
        .collect(Collectors.toMap( //keyMapper
         new Function<Employee,Integer>() {

            @Override
            public Integer apply(Employee t) {
                return t.getId();
            }
        },new Function<Employee,List<Employee>>() {//valueMapper

            @Override
            public List<Employee> apply(Employee t) {
                List<Employee> subordinates = t.getSubordinates();
                List<Employee> subOrdinatesListWithHighestSalary = new ArrayList<>();
                int maxSal = Integer.MIN_VALUE;
                for(Employee s: subordinates) {
                    if(s.getSalary() >= maxSal) {
                        maxSal = s.getSalary();
                    }
                }
                for(Employee s: subordinates) {
                    if(s.getSalary() == maxSal) {
                        subOrdinatesListWithHighestSalary.add(s);
                    }
                }
                return subOrdinatesListWithHighestSalary;
            }
        }));
    }

我想要实现的目标是什么:

员工类具有List< Employee>下属.我想在每个员工的下属中获得最高薪水.每个员工可能有也可能没有下属.如果下属不在,则不包括在结果中.如果不止一个下属具有相同的最高薪水,则所有下属都应该出现在结果中.

例如,它类似于获得每个部门中收入最高的员工(员工,如果工资匹配).

Employee.java

import java.util.List;

public class Employee{

    private int id;
    private int salary;
    private List<Employee> subordinates;
    private String name;
    private int age;

    public int getId() {
        return id;
    }
    public Employee setId(int id) {
        this.id = id;
        return this;
    }
    public int getSalary() {
        return salary;
    }
    public Employee setSalary(int salary) {
        this.salary = salary;
        return this;
    }
    public List<Employee> getSubordinates() {
        return subordinates;

    }
    public Employee setSubordinates(List<Employee> subordinates) {
        this.subordinates = subordinates;
        return this;
    }
    public String getName() {
        return name;
    }
    public Employee setName(String name) {
        this.name = name;
        return this;
    }
    public int getAge() {
        return age;
    }
    public Employee setAge(int age) {
        this.age = age;
        return this;
    }
    @Override
    public String toString() {
        return "Employee [id=" + id + ",salary=" + salary  + ",name=" + name
                + ",age=" + age + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        if (id != other.id)
            return false;
        return true;
    }
}

例如,对于以下输入:

> employee1(id:100)有employee2,employee3,employee4等等
employee3支付最高30000,应该是产出的一部分
> employee2(id:101)有employee5,employee6,其中,employee5的最高薪酬是20000,应该是输出的一部分
> employee3(id:102)有employee7和employee8,两者的薪水都是16000,输出应该包含两者.
> employee8(id:107)有一个下属employee9,薪水12000,employee9应该是输出的一部分

如下所述输入如下:

private static List<Employee>  getEmployeeListV1() {
    int i = 100;
    Employee employee1 = (Employee) new Employee().setId(i++).setSalary(10000).setAge(101).setName("emp 1");
    Employee employee2 = (Employee) new Employee().setId(i++).setSalary(20000).setAge(110).setName("emp 2");
    Employee employee3 = (Employee) new Employee().setId(i++).setSalary(30000).setAge(20).setName("emp 3");
    Employee employee4 = (Employee) new Employee().setId(i++).setSalary(10000).setAge(32).setName("emp 4");
    Employee employee5 = (Employee) new Employee().setId(i++).setSalary(20000).setAge(34).setName("emp 5");
    Employee employee6 = (Employee) new Employee().setId(i++).setSalary(15000).setAge(44).setName("emp 6");
    Employee employee7 = (Employee) new Employee().setId(i++).setSalary(16000).setAge(56).setName("emp 7");
    Employee employee8 = (Employee) new Employee().setId(i++).setSalary(16000).setAge(65).setName("emp 8");
    Employee employee9 = (Employee) new Employee().setId(i++).setSalary(12000).setAge(74).setName("emp 9");

    employee1.setSubordinates(Stream.of(employee2,employee4).collect(Collectors.toList()));
    employee2.setSubordinates(Stream.of(employee5,employee6).collect(Collectors.toList()));
    employee3.setSubordinates(Stream.of(employee7,employee8).collect(Collectors.toList()));
    employee8.setSubordinates(Stream.of(employee9).collect(Collectors.toList()));

    List<Employee> employees = Stream.of(employee1,employee2,employee4,employee5,employee7,employee8,employee9).collect(Collectors.toList());
    return employees;

}

以下是输出:

100=[Employee [id=102,salary=30000,name=emp 3,age=20]]
101=[Employee [id=104,salary=20000,name=emp 5,age=34]]
102=[Employee [id=106,salary=16000,name=emp 7,age=56],Employee [id=107,name=emp 8,age=65]]
107=[Employee [id=108,salary=12000,name=emp 9,age=74]]

阐释:

解决方法

当然,您可以使用方法引用(Employee :: getId或lambda employee – > employee.getId())和valueMapper(t – > {…)将keyMapper更改为lambda,如下所示:

return employees.stream()
                .filter(e -> e.getSubordinates() != null)
                .collect(Collectors.toMap( //keyMapper
                        Employee::getId,t -> {
                            List<Employee> subordinates = t.getSubordinates();
                            List<Employee> subOrdinatesListWithHighestSalary = new ArrayList<>();
                            int maxSal = Integer.MIN_VALUE;
                            for(Employee s: subordinates) {
                                if(s.getSalary() >= maxSal) {
                                    maxSal = s.getSalary();
                                }
                            }
                            for(Employee s: subordinates) {
                                if(s.getSalary() == maxSal) {
                                    subOrdinatesListWithHighestSalary.add(s);
                                }
                            }
                            return subOrdinatesListWithHighestSalary;
                        }));

您可以进一步简化方法:

return employees.stream()
         .filter(e -> e.getSubordinates() != null)
         .collect(Collectors.toMap(Employee::getId,t -> {
                            int maxSal = t.getSubordinates().stream().mapToInt(Employee::getSalary).max().orElse(Integer.MIN_VALUE);
                            return t.getSubordinates().stream().filter(x -> x.getSalary() == maxSal).collect(toCollection(ArrayList::new));

                        }));

甚至更进一步:

return employees.stream()
                .filter(e -> e.getSubordinates() != null)
                .collect(Collectors.toMap(Employee::getId,Main::apply));

鉴于你有这个方法:

static List<Employee> apply(Employee t) {
        List<Employee> subordinates = t.getSubordinates();
        int maxSal = subordinates.stream().mapToInt(Employee::getSalary).max().orElse(Integer.MIN_VALUE);
        return subordinates.stream().filter(x -> x.getSalary() == maxSal).collect(toCollection(ArrayList::new));
}

Main指的是包含apply helper方法的类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读