Доступ к ссылке на объект из первого потока на следующий поток API в Java 8 - PullRequest
1 голос
/ 19 марта 2019

У меня есть ниже существующий код, который преобразовывает один объект в другой -

for(Department dept : company.getDepartments()) {
  if(!isEmpty(dept.getEmployees())) {
        for(Employee emp : dept.getEmployees()) {

        try {
            employyeV2List.add(new EmployeeV2(emp.getId(),  emp.getFirstName(),..., dept.getId()));
        } catch (ParseException e) {
            //error logger
        }

    }
  }

} 

Я хочу добавить java 8 stream api здесь вместо двух for loop, но если вы видите в try block, есть dept.getId(), к которому я не могу получить доступ в потоковом API. Я попробовал ниже -

List<Employee> employees = company.getDepartment().stream().map(x -> x.getEmployees())
            .flatMap(x -> x.stream()).collect(Collectors.toList());


List<EmployeeV2> employeeV2List = employees.stream().map(x -> getEmployeeV2(x)).collect(Collectors.toList());

Здесь, в getEmployeeV2() Я создаю объект EmployeeV2. Но я не уверен, как я могу передать Департамент сюда, чтобы получить доступ к идентификатору отдела.

Ответы [ 2 ]

3 голосов
/ 19 марта 2019

Вы можете сделать это так,

List<EmployeeV2> result = company.getDepartment().stream()
    .flatMap(d -> d.getEmployees().stream()
        .map(e -> new EmployeeV2(e.getId(), e.getFirstName(), d.getId())))
    .collect(Collectors.toList());
0 голосов
/ 21 марта 2019

Поскольку конструктор вашего класса EmployeeV2 выдает исключение, у вас есть разные варианты решения этой проблемы в зависимости от необходимой бизнес-логики.

Первый - поймать исключение в вашей лямбде:

List<EmployeeV2> result = company.getDepartment().stream()
        .flatMap(d -> d.getEmployees().stream()
                .map(e -> {
                    try {
                        return new EmployeeV2(e.getId(), e.getFirstName(), d.getId());
                    } catch (ParseException exception) {
                        return null;
                    }
                }))
        .filter(Objects::nonNull)
        .collect(Collectors.toList());

Это имеет то преимущество, что получает список всех сотрудников, которые могут быть созданы. Но вы не заметите провал.

Вторая альтернатива - обновить конструктор EmployeeV2 и добавить некий RuntimeException, который вам не нужно перехватывать в лямбда-выражении:

try {
    List<EmployeeV2> result = company.getDepartment().stream()
            .flatMap(d -> d.getEmployees().stream()
                    .map(e -> new EmployeeV2(e.getId(), e.getFirstName(), d.getId())))
            .collect(Collectors.toList());
} catch (UncheckedParseException exception) {
    // handle the exception
}

Преимущество этого метода в том, что вы заметите ошибки, но не получите список успешно созданных сотрудников.

Я надеюсь, что эти два примера помогут вам решить, как правильно использовать ваше приложение. Вы также можете передать обработку исключений во внешний метод, как вы уже делали в своем вопросе.

...