API потока Java: вход в потокJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 API потока Java: вход в поток

Сообщение Anonymous »

Отказ от ответственности: приведенный ниже вопрос вызвал немало критики. Единственная причина, по которой я не удалил этот вопрос, заключается в том, что stackoverflow не позволяет мне после того, как кто-то отреагировал на него. Кроме того, код был изменен, поэтому большая часть критики больше не актуальна. Хотя я спровоцировал некоторую дискуссию. Я думаю, это хорошо. Возможно, эта концепция приведет к улучшению нового вопроса от меня или кого-то еще. Вот оно:
Мне очень нравится, как можно программировать потоки 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»