如何使用Java 8 Optionals,如果所有三个都存在,则执行操作?
我有一些使用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”或“自选识字”的方式来处理这种情况(基本上,计算最终操作都需要多个可选)?