【发布时间】:2018-12-11 22:04:22
【问题描述】:
我经常发现与 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);
}
你能想出一种方法在流中包含第一个条件而不使其更复杂吗?
【问题讨论】:
标签: java java-8 java-stream optional