前言我用Java8写了一段逻辑,同事说看不懂。以下是业务背景。你可以看看!业务背景首先,业务需求如下。从第三方电商平台拉取所有订单,保存在公司自己的数据库中。需要判断是否有物流信息。如果有物流信息,需要上传。第三方接口返回的数据是JSON格式,但是物流信息隐藏的很深。如下图,JSON节点是这样的:xxxOrder>xxxShippingInfo>xxxShipmentDetails>xxxTrackingInfo>trackingNumber,trackingLink基本实现了,因为第三方接口返回的数据是JSON格式的,所以需要把JSON字符串转成一个用于处理的Java对象。@JsonIgnoreProperties(ignoreUnknown=true)publicclassXxxOrder{/***物流信息*/@JsonProperty("shippingInfo")privateXxxShippingInfoxxxShippingInfo;}以上只是第一层的例子。获取物流信息需要封装四层对象才能获取到真正的物流信息,为了避免物流信息出现空指针,需要判断四层获取,如示例:if(xxxOrder!=null){if(xxxOrder.getXxxShippingInfo()!=null){if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails()!=null){if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo()!=null){...}}}}获取一个物流信息好麻烦,我也是醉了,写成这样好不雅。Java8实现因为知道Java8可以处理这种需求,所以没想过用最原始的方式实现,直接用Java8实现:/***/privateString[]getFulfillments(XxxOrderxxxOrder){returnOptional.ofNullable(xxxOrder).map((o)->o.getXxxShippingInfo()).map((si)->si.getXxxShipmentDetails()).map((sd)->sd.getXxxTrackingInfo()).map((t)->newString[]{t.getTrackingNumber(),t.getTrackingLink()}).orElse(null);}写完同事看不懂,还跑过来问我。。实现原理其实这并没有用到什么高超的技术。它是使用Java8Optional实现的。我不会介绍细节。它主要是为了避免空指针而创建的。不明白的可以点这里查看本文。今天介绍下Optional#map方法实现这个逻辑的原理,看看map的实现源码:publicOptionalmap(Functionmapper){//FunctionalinterfaceCannotbenullObjects.requireNonNull(mapper);//如果当前没有值,返回一个空Optionalif(!isPresent())returnempty();else{//如果当前有值,返回一个functional的结果值的处理OptionalreturnOptional.ofNullable(mapper.apply(value));}}//判断OptionalValue是否有值publicbooleanisPresent(){returnvalue!=null;}//创建一个Optional,可以为空publicstatic
