Javaのラムダを使用してValueMapper機能を書き換える方法

秘密のスーパースター:

それは可能/正しいです(へ)、または使用して、以下の下に書き直しlambdaここで私はKeyMapperとValueMapperインライン実装を提供してきましたFunction

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> subordinates私は部下の間で支払わ最高給与取得しようとしています下の各従業員を。各従業員は、あるいは部下を持っていない可能性があります。部下が存在しない場合、彼らは結果に含まれていません。複数の従属有する同一の最高給与場合は、それらのすべてが結果に存在しなければなりません。

例えば、各部門で最も高い支払った従業員(給与が一致した場合、従業員を)取得するために類似しています。

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)給料12000で1従属employee9を持っていると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,employee3,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,
                employee3,employee4,employee5,
                employee6,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, salary=16000, name=emp 8, age=65]]
107=[Employee [id=108, salary=12000, name=emp 9, age=74]]

、について説明:

Ousmane D .:

確かに、あなたは変更することができるkeyMapper方法を参照(とEmployee::getIdやラムダemployee -> employee.getId())とvalueMappert -> { ...次のようにラムダへ):

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ヘルパーメソッドを。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=200850&siteId=1