在java8中处理多个Null检查

时间:2017-06-16 07:28:49

标签: java java-8

在下面的情况下,我没有多次空检查,而是计划添加一些可读的代码。可以借助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;
    }

4 个答案:

答案 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("");

SafeCallable

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 "";
  }
}