[英]nested arraylist to hashmap in Java8
我有以下对象-
公司.java
private String compName;
private List<Department> departments;
部门.java
private String deptId;
private String deptName;
private List<Employee> employees;
Employee.java
private String empId;
private String legalStatement;
我想退回每个员工法律声明的地图-
Map<String, String> legalStatement = new HashMap<>();
为此,现有逻辑是-
for(Department department : departments){
if(department.getEmployees() != null &&
department.getEmployees().size() > 0){
for(Employee employee : department.getEmployees()){
legalStatement.put(employee.getEmpId(),
employee.getLegalStatement());
}
}
}
如何在Java 8 Stream API中编写相同的内容。
您可以将流的filter
用于if
, flatMap
用于内部employee
列表,并collect
以Map
收集:
Map<String, String> legalStatement = departments.stream()
.filter(department -> department.getEmployees() != null && !department.getEmployees().isEmpty())
.flatMap(department -> department.getEmployees().stream())
.collect(Collectors.toMap(Employee::getEmpId, Employee::getLegalStatement));
通过使用flatMap
和ternary
运算符
Map<String,String> result = departments.stream()
.flatMap(d->(Objects.nonNull(d.getEmployees()) && !d.getEmployees().isEmpty()) ? d.getEmployees().stream() : Stream.empty())
.collect(Collectors.toMap(Employee::getEmpId, Employee::getLegalStatement));
作为@nullpointer建议,如果有可能出现重复的员工ID,请使用mergeFunction
public static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
如果映射的键包含重复项(根据Object.equals(Object)),则将值映射函数应用于每个equal元素,然后使用提供的合并函数合并结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.