Зависит от того, что вы подразумеваете под «чище».
Решение ifPresent
, как указывает @Naman, выглядит следующим образом:
firstRequiredOptional.ifPresent(firstValue ->
secondRequiredOptional.ifPresent(secondValue -> {
// do something with firstValue, secondValue.
}));
Это «чище» в ощущение, что вам не нужно вызывать оба значения .isPresent()
и .get()
для двух дополнительных опций.
Нет Optional<FirstType, SecondType>
, но если комбинация этих двух обязательных значений имеет какое-то значение, вы Возможно, вы захотите воплотить это в классе.
Optional<FullName> fullNameOptional = firstNameOptional.flatMap(firstName ->
secondNameOptional.map(secondName -> new FullName(firstName, secondName));
fullNameOptional.ifPresent(fullName -> {
// do something with fullName.
});
Это дает вам преимущество, заключающееся в том, что вы можете получить одно необязательное значение, с которым вы можете работать, передавая вспомогательные методы и т. д. c., и оно следует за командой - шаблон разделения запросов, имеющий тенденцию иметь преимущества при отладке и разбиении вашего кода на части, которые просты для модульного тестирования. Но это не «чище» в том смысле, что вы используете меньше кода, например.
Если вам нравится идея преобразования в один Optional
, но вы не хотите создавать тип просто для этого вы можете создавать универсальные классы Tuple (или использовать одну из нескольких популярных библиотек Tuple).