首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将以下代码段转换为Java 8特性?

如何将以下代码段转换为Java 8特性?
EN

Stack Overflow用户
提问于 2019-09-23 16:04:42
回答 2查看 100关注 0票数 2

我有POJO员工,它有如下所示的技能列表:

代码语言:javascript
复制
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;
    }
}
代码语言:javascript
复制
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;
    }
}

我正在尝试做以下事情:

代码语言:javascript
复制
 List<Employee> javaEmpList = new ArrayList<>();

        for (Employee emp : empList) {

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

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

我正在尝试使用Java8特性来转换这个实现。有人能帮我做同样的事吗?我是Java 8的新手。我尝试过使用streams + filter + map组合,但我无法达到效果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-23 16:08:00

您需要做的是在List<Employee>上使用Stream,使用filter()只保留具有Java技能的Employee,并将过滤后的Employee放入新的List中。

请注意,这与嵌套循环的行为并不完全相同,但我假设您并不是真的希望在输出List中多次添加相同的Employee

代码语言:javascript
复制
List<Employee> javaEmpList =
    empList.stream()
           .filter(emp -> emp.getSkills()
                             .stream()
                             .anyMatch(skill -> skill.getLanguage().equalsIgnoreCase("Java")))
           .collect(Collectors.toList());
票数 4
EN

Stack Overflow用户

发布于 2019-09-23 16:48:51

Eran解决方案的替代方案是将每个技能的employeelanguage映射到其实例,然后只使用所需的语言过滤条目。Post,您可以根据需要收集重复或唯一的值集合。这可以通过以下方式实现:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58058067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档