资源描述:
《使用Java8Optional的正确姿势.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、使用Java8Optional的正确姿势——动力节点java我们知道Java8增加了一些很有用的API,其中一个就是Optional.如果对它不稍假探索,只是轻描淡写的认为它可以优雅的解决NullPointException的问题,于是代码就开始这么写了.Optionaluser=......if(user.isPresent()){returnuser.getOrders();}else{returnCollections.emptyList();}那么不得不说我们的思维仍然是在原
2、地踏步,只是本能的认为它不过是User实例的包装,这与我们之前写成Useruser=.....if(user!=null){returnuser.getOrders();}else{returnCollections.emptyList();}实质上是没有任何分别.这就是我们将要讲到的使用好Java8Optional类型的正确姿势.在里约奥运之时,新闻一再提起五星红旗有问题,可是我怎么看都看不出来有什么问题,后来才道是小星星膜拜中央的姿势不对.因此我们千万也别对自己习以为常的事情觉得理所当然,丝
3、毫不会觉得有何不妥,换句话说也就是当我们切换到Java8的Optional时,不能继承性的对待过往null时的那种思维,应该掌握好新的,正确的使用Java8Optional的正确姿势.直白的讲,当我们还在以如下几种方式使用Optional时,就得开始检视自己了1.调用 isPresent() 方法时2.调用 get() 方法时3.Optional类型作为类/实例属性时4.Optional类型作为方法参数时isPresent() 与 obj!=null 无任何分别,我们的生活依然在步步惊心.而没有
4、 isPresent() 作铺垫的 get() 调用在IntelliJIDEA中会收到告警Reportscallstojava.util.Optional.get()withoutfirstcheckingwithaisPresent()callifavalueisavailable.IftheOptionaldoesnotcontainavalue,get()willthrowanexception.(调用Optional.get()前不事先用isPresent()检查值是否可用.假如Opti
5、onal不包含一个值,get()将会抛出一个异常)把Optional类型用作属性或是方法参数在IntelliJIDEA中更是强力不推荐的Reportsanyusesofjava.util.Optional,java.util.OptionalDouble,java.util.OptionalInt,java.util.OptionalLongorcom.google.common.base.Optionalasthetypeforafieldoraparameter.Optionalwas
6、designedtoprovidealimitedmechanismforlibrarymethodreturntypeswherethereneededtobeaclearwaytorepresent“noresult”.Usingafieldwithtypejava.util.OptionalisalsoproblematiciftheclassneedstobeSerializable,whichjava.util.Optionalisnot.(使用任何像Optional的类型作为字段或方
7、法参数都是不可取的.Optional只设计为类库方法的,可明确表示可能无值情况下的返回类型.Optional类型不可被序列化,用作字段类型会出问题的)所以Optional中我们真正可依赖的应该是除了 isPresent() 和 get() 的其他方法:1.publicOptionalmap(Functionmapper)1.publicTorElse(Tother)2.publicTorElseGet(Supplieroth
8、er)3.publicvoidifPresent(Consumerconsumer)4.publicOptionalfilter(Predicatepredicate)5.publicOptionalflatMap(Function>mapper)6.publicTorElseThrow(SupplierexceptionSupplier)th