вложенный массив для hashmap в Java8 - PullRequest
1 голос
/ 08 марта 2019

У меня есть ниже объектов -

Company.java

private String compName;
private List<Department> departments;

Department.java

private String deptId;
private String deptName;
private List<Employee> employees;

Employee.java

private String empId;
private String legalStatement;

Я хочу вернуть Map каждого юридического заявления сотрудника -

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.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Используя 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, если есть возможность использования идентификатора дубликата сотрудника 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)), функция сопоставления значений применяется к каждому равному элементу, а результаты объединяются с использованием предоставленной функции объединения.

0 голосов
/ 08 марта 2019

Вы можете использовать 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));
...