Одна область, которую я часто нахожу в замешательстве с потоками Java 8, - это когда промежуточный результат может быть пустым, и вам нужно выбрать альтернативные пути, если он пуст или не пуст.
Например, если у меня есть кодкак это:
String pymtRef = defaultValue;
Optional<PaymentTender> paymentTender = paymentTenders.stream()
.filter(pt -> (pt.getFlag() == Flag.N || pt.getFlag() == null)).findFirst();
if (paymentTender.isPresent()) {
pymtRef = paymentTender.get().getId();
}
return pymtRef;
Я хотел бы выяснить, как удалить условный блок и сделать это в одном потоке.
Если я просто вызову «.map» в результате фильтра, который может работать, если он нашел подходящую запись.Если нет, я получаю NoSuchElementException.
Я мог бы вместо этого использовать «ifPresent ()», но тип возвращаемого значения «void».
Есть ли способ сделать это чище?
Обновление :
Решение, использующее "orElse ()", работает нормально.
Весь метод теперь выглядит примерно так:
public String getPaymentReference(OrderContext orderContext) {
List<PaymentTender> paymentTenders = getPaymentTenders(orderContext);
if (paymentTenders.size() == 1) {
return paymentTenders.get(0).getId();
}
return paymentTenders.stream()
.filter(pt -> (pt.getAutoBill() == AutoBill.N || pt.getAutoBill() == null))
.findFirst().map(pt -> pt.getId()).orElse(DEFAULT_VALUE);
}
Можете ли вы придумать способ включить первое условное выражение в поток, не усложняя его?