[英]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.