Поскольку конструктор вашего класса 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
}
Преимущество этого метода в том, что вы заметите ошибки, но не получите список успешно созданных сотрудников.
Я надеюсь, что эти два примера помогут вам решить, как правильно использовать ваше приложение. Вы также можете передать обработку исключений во внешний метод, как вы уже делали в своем вопросе.