2 votes

Comment puis-je convertir l'extrait ci-dessous en caractéristiques Java 8 ?

J'ai un employé POJO qui a une liste de compétences comme indiqué ci-dessous:-

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;
    }
}

Et j'essaie de faire ce qui suit :-)

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

        for (Employee emp : empList) {

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

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

J'essaie de convertir cette implémentation en utilisant les fonctionnalités de Java 8. Quelqu'un peut-il m'aider ? Je ne connais pas Java 8. J'ai essayé d'utiliser la combinaison streams + filter + map mais je n'arrive pas à obtenir le résultat.

4voto

Eran Points 35360

Ce qu'il faut, c'est Stream sur le List<Employee> , utiliser filter() de ne garder que Employee ayant la compétence Java, et collect() le filtré Employee dans un nouveau List .

Notez que ce n'est pas exactement le même comportement que vos boucles imbriquées, mais j'ai supposé que vous ne vouliez pas vraiment ajouter les mêmes Employee plusieurs fois vers la sortie List .

List<Employee> javaEmpList =
    empList.stream()
           .filter(emp -> emp.getSkills()
                             .stream()
                             .anyMatch(skill -> skill.getLanguage().equalsIgnoreCase("Java")))
           .collect(Collectors.toList());

2voto

nullpointer Points 1135

Une alternative à la solution d'Eran consisterait à cartographier les compétences de chaque language pour un employee à son instance, puis filtrer les entrées en fonction de la langue souhaitée. Ensuite, vous pouvez collecter la collection de valeurs en fonction de l'exigence de duplication ou d'unicité. Cela peut être réalisé comme suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X