gpt4 book ai didi

java - 过滤掉Java 8流过滤器表达式中的空值,因此不会抛出异常

转载 作者:行者123 更新时间:2023-12-01 14:20:44 25 4
gpt4 key购买 nike

我有一个 Java 8 流表达式,它有 3 个过滤器并且工作正常。
我想防止大多数值的过滤器中出现空指针异常。
这是表达式:

if(!purchasedTripSegments.isEmpty()) {
filteredList = purchasedTripSegments.stream()
.filter(segment -> PurchasedVendorType.RAIL.equals(segment.getVendorType()))
.filter(distinctByKeys(segment -> Arrays.asList(segment.getBillingMethod(),
segment.getOrigin().getNumberCode(), segment.getDestination().getNumberCode(),
segment.getStopOff().getStopOffLocation().getNumberCode())))
.filter(segment -> segment.getBillingMethod().equalsIgnoreCase(BILLING_METHOD_LOCAL) ||
(segment.getBillingMethod().equalsIgnoreCase(BILLING_METHOD_RULE) &&
segment.getDestination().getNumberCode() !=
segment.getStopOff().getStopOffLocation().getNumberCode()))
.collect(Collectors.toList());
}
所以 VendorType 不能为空。
所以第一个过滤器会很好。
第二个和第三个过滤器可以有空值。
对象(Origin、Destination、StopOff、StopOffLocation)可以为空。
并且值 (BillingMethod, NumberCode) 可以为 null。
如果过滤器中的任何值是空值,有没有办法忽略过滤器?
我尝试添加 .filter(Objects::nonNull)我有一个测试用例,它有一个空目标对象,并且抛出了 NullPointerException。
更新
我更新了 billingMethod。但我不清楚如何使用 Optional 来避免空检查。
Optional<List<PurchasedTripSegment>> filteredList =  Optional.ofNullable(new ArrayList<>());

if(!purchasedTripSegments.isEmpty()) {
filteredList = purchasedTripSegments.stream()
.filter(segment -> PurchasedVendorType.RAIL.equals(segment.getVendorType()))
.filter(distinctByKeys(segment -> Arrays.asList(segment.getBillingMethod(),
segment.getOrigin().getNumberCode(),
segment.getDestination().getNumberCode(),
segment.getStopOff().getStopOffLocation().getNumberCode())))
.filter(segment -> BILLING_METHOD_LOCAL.equals(segment.getBillingMethod())
|| (BILLING_METHOD_RULE.equals(segment.getBillingMethod()) &&
segment.getDestination().getNumberCode() !=
segment.getStopOff().getStopOffLocation().getNumberCode()))
.collect(Collectors.toList());
}
我不确定如何将您建议的更改应用于我的过滤器。我尝试按书面方式添加,但无法识别 map()。
中间过滤器将是最困难的。
如何检查每个段的对象和值?
更新
根据下面使用 Optional 实现 Utility 方法的评论。
private Optional<Integer> getDestinationCode(PurchasedCostTripSegment purchasedCostTripSegment) {
return Optional.ofNullable(purchasedCostTripSegment.getDestination()) // empty for 'null'
.map(Destination::getNumberCode);
}
我对传入参数进行空检查。
我收到一个错误,方法 getNumberCode不被认可。

最佳答案

billingMethod等属性, 只要有可能 nullList ,它应该仍然适用于比较以获得不同的值。
另一方面,将它们与其他一些字符串常量进行比较可以通过用户 FilipRistic suggested 的方式解决。 .
但是,当涉及可能为空的对象并且您想安全地进一步访问内部属性时,您可以使用 Optional并链接访问器。对于其中的示例,当您想访问 numberCode 时您的目的地可能为空,您可以在 PurchasedTripSegment 中有一个访问器类来公开这个:

Optional<Integer> getDestinationCode() {
return Optional.ofNullable(this.getDestination()) // empty for 'null'
.map(Node::getNumberCode);
}
对其他访问器进行类似的更改,您的整体代码将更新并更改为以下内容:
filteredList = purchasedTripSegments.stream()
.filter(segment -> PurchasedVendorType.RAIL.equals(segment.getVendorType()))
.filter(distinctByKey(segment -> Arrays.asList(segment.getBillingMethod(),
segment.getOriginCode(), segment.getDestinationCode(),
segment.getStopOffLocationCode())))
.filter(segment -> segment.getBillingMethod().equalsIgnoreCase(BILLING_METHOD_LOCAL) ||
(segment.getBillingMethod().equalsIgnoreCase(BILLING_METHOD_RULE) &&
segment.getDestinationCode().equals(segment.getStopOffLocationCode())))
.collect(Collectors.toList());

关于java - 过滤掉Java 8流过滤器表达式中的空值,因此不会抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62584902/

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