在下面的情况下,我没有多次空检查,而是计划添加一些可读的代码。可以借助java 8流/地图。有人可以帮助我吗
private String getRailsServiceClass(IRailsComponent railsComponent) {
String serviceClass = "";
if (railsComponent != null && railsComponent.getRailOffer() != null && railsComponent.getRailOffer().getRailProducts().get(0).getRailProduct() != null && railsComponent.getRailOffer().getRailProducts().get(0).getRailProduct().getFareBreakdownList() != null &&
railsComponent.getRailOffer().getRailProducts().get(0).getRailProduct().getFareBreakdownList().get(0).getPassengerFareList() != null && railsComponent.getRailOffer().getRailProducts().get(0).getRailProduct().getFareBreakdownList().get(0).getPassengerFareList().get(0).getPassengerSegmentFareList() != null &&
railsComponent.getRailOffer().getRailProducts().get(0).getRailProduct().getFareBreakdownList().get(0).getPassengerFareList().get(0).getPassengerSegmentFareList().get(0).getCarrierServiceClassDisplayName() != null) {
return railsComponent.getRailOffer().getRailProducts().get(0).getRailProduct().getFareBreakdownList().get(0).getPassengerFareList().get(0).getPassengerSegmentFareList().get(0).getCarrierServiceClassDisplayName();
}
return serviceClass;
}
答案 0 :(得分:23)
您可以使用“可选”作为您的目的。
String serviceClass = Optional.ofNullable(railsComponent)
.map(IRailsComponent::getRailOffer)
.map(RailOffer::getRailProducts)
...
.orElse("");
答案 1 :(得分:3)
您的代码很糟糕,因为在每次检查时您都必须一次又一次地获取列表中的项目。这是很多I / O要做的事。
不使用任何API(所以Java 8之前的解决方案)您可以通过逐个检查每个项目来清理代码(取决于每个类的可访问性,但这是一个完全开发的条件
RailComponent rc = getRailComponent();
if (rc != null) {
RailOffer ro = rc.getRailOffer()
if (ro != null) {
RailProduct rp = ro.getRailProducts().get(0).getRailProduct();
if (rp != null) {
List<FareBreakDown> fbList = rp.getFareBreakdownList();
if (fbList != null) {
List<PassengerFare> pfList = fb.get(0).getPassengerFareList();
if (pfList != null) {
List<PassengerSegmentFare> psfList = pfList.get(0).getPassengerSegmentFareList();
if (psfList != null) {
String carrierServiceClassDisplayName = psfList.get(0).getCarrierServiceClassDisplayName();
if (carrierServiceClassDisplayName != null) {
return carrierServiceClassDisplayName;
}
}
}
}
}
}
}
一旦你减少了代码的详细程度,你就会发现这并不是很重要。
答案 2 :(得分:2)
灵感来自kotlin safe call operator ?.
&amp; elivs opreator ?:
,您可以链接自定义SafeCallable
。例如:
String serviceClass = SafeCallable.of(railsComponent)
.then(IRailsComponent::getRailOffer)
.then(RailOffer::getRailProducts)
.then(products -> products.get(0))
.then(...)
.orElse("");
interface SafeCallable<T> {
T call();
static <T> SafeCallable<T> of(T value) {
return () -> value;
}
// ?. operator
default <R> SafeCallable<R> then(Function<T, R> step) {
return then(step, () -> null);
}
// ?: operator
default T orElse(T value) {
return then(identity(), () -> value).call();
}
default <R> SafeCallable<R> then(Function<T, R> step, Supplier<R> otherwise) {
T value = call();
return value == null ? otherwise::get : () -> step.apply(value);
}
}
答案 3 :(得分:1)
如果null
中的任何一个很少见,我会使用try catch
块:
private String getRailsServiceClass(IRailsComponent railsComponent) {
try {
return railsComponent.getRailOffer().getRailProducts().get(0)
.getRailProduct().getFareBreakdownList().get(0).getPassengerFareList().get(0)
.getPassengerSegmentFareList().get(0).getCarrierServiceClassDisplayName();
} catch (NullPointerException e) {
return "";
}
}