Мне очень нравится, как можно программировать потоки 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(logOnFalse(Contact::hadRecentProjects,
"contact didn't have any recent projects"))
.filter(logOnFalse(Contact::validatedByBoardOfCommerce,
"contact is not validated by board of commerce"))
.map(supplier -> Optional.of(supplier.getAddress())
.filter(logOnFalse(Optional::isPresent,
"no address specified for supplier"))
.map(Optional::get)
.filter(logOnFalse(not(Address::isPobox),
"address is not valid, no po. box allowed"));
}
private Predicate logOnFalse(Predicate condition, String logStrOnFalse) {
return condition.or(x1 -> { log.debug(logStrOnFalse); return false; });
}
Я уже изменил немного кода, но мне не хотелось бы переходить к
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-a-stream
Мобильная версия