gpt4 book ai didi

java - 即使为空,如何干净地处理 java 8 流 "findFirst()"结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:21:55 25 4
gpt4 key购买 nike

我经常发现与 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;

我想弄清楚如何删除条件 block 并在单个流中执行此操作。

如果我简单地在过滤结果上调用“.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);
}

你能想出一种方法来将第一个条件包含在流中而不会使它变得更复杂吗?

最佳答案

map 之后直接调用 get() 将在 Optional 为空状态时产生异常,而不是在 之后调用 orElse映射并提供默认值:

paymentTenders.stream()
.filter(pt -> (pt.getFlag() == Flag.N || pt.getFlag() == null))
.findFirst()
.map(PaymentTender::getId)
.orElse(someDefaultValue);

编辑:

至于:

Can you think of a way to include the first conditional in the stream without making it more complex?

不,这比你完成它的方式更好。它更具可读性和更容易理解。

引入任何类型的逻辑使其成为一个管道(如果可能)只会变得复杂,因此更难遵循和理解。

关于java - 即使为空,如何干净地处理 java 8 流 "findFirst()"结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53733033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com