У меня есть некоторый (упрощенный) код, который использует Java Optionals:
Optional<User> maybeTarget = userRepository.findById(id1);
Optional<String> maybeSourceName = userRepository.findById(id2).map(User::getName);
Optional<String> maybeEventName = eventRepository.findById(id3).map(Event::getName);
maybeTarget.ifPresent(target -> {
maybeSourceName.ifPresent(sourceName -> {
maybeEventName.ifPresent(eventName -> {
sendInvite(target.getEmail(), String.format("Hi %s, $s has invited you to $s", target.getName(), sourceName, meetingName));
}
}
}
Излишне говорить, что это выглядит и плохо. Но я не могу придумать другой способ сделать это менее вложенным и более читаемым способом. Я рассмотрел возможность потоковой передачи 3-х опций, но отказался от этой идеи, выполняя .filter(Optional::isPresent)
затем .map(Optional::get)
чувствует себя еще хуже.
Таким образом, есть лучший, более "Java 8" или "Необязательно-грамотный" способ справиться с этой ситуацией (по существу, несколько опций, необходимых для вычисления окончательной операции)?