Как я могу преобразовать приведенный ниже фрагмент в функции Java 8? - PullRequest
2 голосов
/ 23 сентября 2019

У меня есть сотрудник POJO, у которого есть список навыков, как показано ниже: -

public class Skills {

    private String language;
    private double versions;

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public double getVersions() {
        return versions;
    }

    public void setVersions(double versions) {
        this.versions = versions;
    }
}

import java.util.List;

public class Employee {

    private long empId;
    private String empName;
    private String empAddress;
    private double salary;
    private List<Skills> skills;

    public List<Skills> getSkills() {
        return skills;
    }

    public void setSkills(List<Skills> skills) {
        this.skills = skills;
    }

    public long getEmpId() {
        return empId;
    }

    public void setEmpId(long empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getEmpAddress() {
        return empAddress;
    }

    public void setEmpAddress(String empAddress) {
        this.empAddress = empAddress;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", empAddress='" + empAddress + '\'' +
                ", salary=" + salary +
                '}';
    }

    public Employee(long empId, String empName, String empAddress, double salary, List<Skills> skills) {
        this.empId = empId;
        this.empName = empName;
        this.empAddress = empAddress;
        this.salary = salary;
        this.skills = skills;
    }
}

И я пытаюсь сделать следующее: -

 List<Employee> javaEmpList = new ArrayList<>();

        for (Employee emp : empList) {

            for (Skills skill : emp.getSkills()) {

                if (skill.getLanguage().equalsIgnoreCase("Java")) {
                    javaEmpList.add(emp);
                }
            }
        }

Япытаясь преобразовать эту реализацию с помощью функций Java 8.Может кто-нибудь, пожалуйста, помогите мне с тем же?Я новичок в Java 8. Я пытался использовать комбинацию «потоки + фильтр + карта», но не смог достичь результата.

Ответы [ 2 ]

4 голосов
/ 23 сентября 2019

Вам нужно набрать Stream над List<Employee>, использовать filter(), чтобы сохранить только Employee s с навыком Java, и collect() отфильтрованные Employee s в новый List.

Обратите внимание, что это не совсем то же самое, что и ваши вложенные циклы, но я предположил, что вы на самом деле не хотите добавлять один и тот же Employee несколько раз к выводу List.

List<Employee> javaEmpList =
    empList.stream()
           .filter(emp -> emp.getSkills()
                             .stream()
                             .anyMatch(skill -> skill.getLanguage().equalsIgnoreCase("Java")))
           .collect(Collectors.toList());
2 голосов
/ 23 сентября 2019

Альтернативой решению Эрана было бы сопоставить language каждого навыка для employee с его экземпляром, а затем отфильтровать записи только на требуемом языке.Размещать которые вы можете собирать коллекции значений на основе требования дубликатов или уникальных.Это может быть достигнуто как:

List<Employee> employeesWithJavaSkills = employeeList.stream()
        .flatMap(employee -> employee.getSkills().stream()
                .map(skills -> new AbstractMap.SimpleEntry<>(skills.getLanguage(), employee)))
        .filter(entry -> entry.getKey().equalsIgnoreCase("Java"))
        .map(AbstractMap.SimpleEntry::getValue)
        .collect(Collectors.toList()); // Collectors.toSet() for unique employees
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...