我有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);
}
}
}我正在尝试使用Java8特性来转换这个实现。有人能帮我做同样的事吗?我是Java 8的新手。我尝试过使用streams + filter + map组合,但我无法达到效果。
发布于 2019-09-23 16:08:00
您需要做的是在List<Employee>上使用Stream,使用filter()只保留具有Java技能的Employee,并将过滤后的Employee放入新的List中。
请注意,这与嵌套循环的行为并不完全相同,但我假设您并不是真的希望在输出List中多次添加相同的Employee。
List<Employee> javaEmpList =
empList.stream()
.filter(emp -> emp.getSkills()
.stream()
.anyMatch(skill -> skill.getLanguage().equalsIgnoreCase("Java")))
.collect(Collectors.toList());发布于 2019-09-23 16:48:51
Eran解决方案的替代方案是将每个技能的employee的language映射到其实例,然后只使用所需的语言过滤条目。Post,您可以根据需要收集重复或唯一的值集合。这可以通过以下方式实现:
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 employeeshttps://stackoverflow.com/questions/58058067
复制相似问题