簡體   English   中英

在Java8中將arraylist嵌套到hashmap

[英]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用於ifflatMap用於內部employee列表,並collectMap收集:

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

通過使用flatMapternary運算符

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM