【发布时间】:2020-06-25 21:53:57
【问题描述】:
我有一个 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) 可以为空。
如果过滤器中的任何值为空值,有没有办法忽略过滤器?
我尝试添加.filter(Objects::nonNull)
我有一个测试用例,它的目标对象为空,并且抛出了 NullPointerException。
更新 我更新了计费方法。但我不清楚如何使用 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 实现实用程序方法。
private Optional<Integer> getDestinationCode(PurchasedCostTripSegment purchasedCostTripSegment) {
return Optional.ofNullable(purchasedCostTripSegment.getDestination()) // empty for 'null'
.map(Destination::getNumberCode);
}
我对传入参数进行空检查。
我收到一个错误,指出方法 getNumberCode 无法识别。
【问题讨论】:
标签: java java-stream