Мне очень нравится, как можно программировать потоки Java как способ перехода от входной переменной к выходной с помощью серии четко определенных стандартизированных шагов, таких как отображение и фильтрация. Поэтому иногда жалко покидать эту структуру. Иногда кажется, что проще и читабельнее оставить эту структуру, но это может быть связано с отсутствием доступной библиотечной функциональности, лучших практик или моих знаний о них.
Давайте посмотрим на этот код «старой школы» (ну, в нем есть необязательный и var, так что не такой уж старый)
Код: Выделить всё
public Optional getValidSupplierAddress(Contact contact) {
if (!contact.hadRecentProjects) {
log.debug("contact didn't have any recent projects");
return Optional.empty();
}
if (!contact.validatedByBoardOfCommerce()) {
log.debug("contact is not validated by board of commerce");
return Optional.empty();
}
var address = contact.getAddress();
if (address == null) {
log.debug("no address specified for contact");
return Optional.empty();
}
if (address.isPobox()) {
log.debug("address is not valid, no po. box allowed");
return Optional.empty();
}
return Optional.of(address);
}
Код: Выделить всё
public Optional getValidSupplierAddress(Contact contact) {
return Optional.of(contact)
.filter(testOrElse(Contact::hadRecentProjects,
() -> log.debug("contact didn't have any recent projects")))
.filter(testOrElse(Contact::validatedByBoardOfCommerce,
() -> log.debug("contact is not validated by board of commerce")))
.map(supplier -> Optional.of(supplier.getAddress())
.filter(testOrElse(Optional::isPresent,
() -> log.debug("no address specified for supplier")))
.map(Optional::get)
.filter(testOrElse(not(Address::isPobox),
() -> log.debug("address is not valid, no po. box allowed")));
}
private Predicate testOrElse(Predicate condition, Runnable executeOnFalse) {
return condition.or(x1 -> { executeOnFalse.run(); return false; });
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-a-stream
Мобильная версия