java8optional类深度解析-java开发java经验技巧

java8optional类深度解析-java开发java经验技巧

ID:30768775

大小:98.50 KB

页数:8页

时间:2019-01-03

上传者:U-991
java8optional类深度解析-java开发java经验技巧_第1页
java8optional类深度解析-java开发java经验技巧_第2页
java8optional类深度解析-java开发java经验技巧_第3页
java8optional类深度解析-java开发java经验技巧_第4页
java8optional类深度解析-java开发java经验技巧_第5页
资源描述:

《java8optional类深度解析-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

Java8Optional类深度解析-Java开发Java经验技巧Java8Optional类深度解析木文由ImportNew・高俊阳翻译自javacodegeekso欢迎加入翻译小组。转载请见文末要求。身为一名九腹程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法。我们首先耍判断这个返回值是否为null,只冇在非空的前捉下才能将其作为其他方法的参数。这正是一些类似Guava的外部API试图解决的问题。一些JVM编程语言比如Scala、Ceylon等己经将对在核心API屮解决了这个问题。在我的前一篇文章屮,介绍了Scala是如何解决了这个问题。新版本的Java,比如Java8引入了一个新的Optional类<>Optional类的Javadoc描述如下:这是一个可以为null的容器对彖。如果值存在则isPresent()方法会返冋true,调用get()方法会返冋该对象。本文会逐个探讨Optional类包含的方法,并通过一两个示例展示如何使用。of为非null的值创建一个Optionaloof方法通过工厂方法创建Optional类。需要注意的是,创建对彖时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException。//调用工厂方法创建Optional实例Optionalname=Optiona1.of("Sdnaulla");//传入参数为null,抛岀NullPointerException.OptionaKStr、ing>someNull二Optional.of(null);ofNulTable为指定的值创建一个Optional,如果指定的值为nul1,则返回一个空的OptionaloofNullable与of方法相似,唯一的区别是可以接受参数为null的情况。示例如下://下面创建了一个不包含任何值的Optional实例〃例如,值为’null'Optioneilempty=Optiona1.ofNullable(null);isPresent 非常容易理解如果值存在返冋true,否则返冋false。类似下面的代码://isPresent方法用來检查Optional实例中是否包含值if(namc.isPresent()){//在Optional实例内调用get()返回已存在的值System.out.printin(name.get());//输丨I]Sanaulla}get如果Optional有值则将其返回,否则抛出NoSuchElementException。上面的示例中,get方法用來得到Optional实例中的值。下面我们看一个抛出NoSuchElementException的例子://执彳亍下面的代码会输出:Novaluepresenttry{//在空的Optional实例上调用get(),抛出NoSuchElementExceptionSystem,out.printin(empty,get());}catch(NoSuchElementExceptionex){System,out.printin(ex.getMessage());}ifPresent如果Optional实例有值则为其调用consumer,否则不做处理要理解ifPresent方法,首先需要了解Consumer类。简答地说,Consumer类包含一个抽象方法。该抽象方法对传入的值进行处理,但没冇返回值。支持不用接口直接通过lambda表达式传入参数。如果Optional实例有值,调用ifPresent()可以接受接口段或lambda表达式。类似下面的代码://ifPresent方法接受1ambda表达式作为参数。//lambda表达式对Optional的值调用consumer进行处理。namc.ifPrcscnt((value)->{System.out・printin("Thelengthofthevalueis:"+value,length());});orElse 如果有值则将其返回,否则返回指定的其它值。如果Optional实例有值则将其返冋,否则返冋orElse方法传入的参数。示例如下://如果值不为nul1,orElse方法返回Optional实例的值。//如果为null,返回传入的消息。//输岀:Thereisnovaluepresent!System,out.printin(empty.orElse(,zThereisnovaluepresent!,z));//输出:SanaullaSystem,out.printin(name.orElse(^Thereissomevalue!"));orElseGetorElseGet与orElse方法类似,区别在丁•得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。示例如下://orElseGet与orElse方法类似,区别在于orElse传入的是默认值,//orElseGet可以接受一个lambda表达式生成默认值。//输出:DefaultValueSystem,out.printin(empty.orElseGet(()->''DefaultValue"));//输出:SanaullaSystem,out.printin(name.orElseGet(()->"DefaultValue"));orElseThrow如果冇值则将其返回,否则抛出supplier接口创建的异常。在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。示例如下:try{//orElseThrow与orElse方法类似。与返回默认值不同,//orElseThrow会抛岀lambda表达式或方法生成的异常empty.orElseThrow(VaiueAbsenlException::new);}catch(Throwableex){//输出:NovaluepresentintheOptionalinstanceSystem.out.println(ex.getMessage());}VaiueAbsentException定义如下:classValueAbsentExceptionextendsThrowable{publicValueAbsentException(){ super();}publicValueAbsentException(Stringmsg){super(msg);}©OverridepublicStringgetMessage(){return"NovaluepresentintheOptionalinstance";}}mapmap方法文档说明如下:如果有值,则对其执行调用mapping函数得到返冋值。如果返冋值不为null,则创建包含mapping返冋值的Optional作为map方法返回值,否则返回空Optional□map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。如果你不熟悉Function接口,可以参考我的这篇博客。map方法示例如H://map方法执彳亍传入的lambda表达式参数对Optional实例的值进行修改。//为1ambda表达式的返回值创建新的Optional实例作为map方法的返回值。Optioneil〈String>uppcrNamc=name・map((valuc)->valuc.toUppcrCasc());System.out.println(upperName.orElse(z,Novaluefound,z));flatMap如果有值,为其执行mapping函数返回Optional类型返回值,否则返冋空OptionaloflatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optionalo调用结束时,flatMap不会对结果用Optional圭寸装。flatMap方法与map方法类似,区别在于mapping函数的返冋值不同。map方法的mapping函数返冋值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。参照map函数,使用flatMap重写的示例如卜•://flatMap与map(Function)非常类似,区别在于传入方法的lambda表达式的返冋类型。//map方法小的lambda表达式返冋值可以是任意类型,在map函数返冋之前会 包装为Optional。//但fldtMap方法中的lambda表达式返回值必须是Optionl实例。upperName=name・flatMap((value)->Optiona1.of(value.toUpperCase()));System,out.printIn(upperName.orElse(,zNovaluefouncT));//输;11SANAULLAfilterfilter个方法通过传入限定条件对Optional实例的值进行过滤。文档描述如下:如果冇值并且满足断言条件返回包含该值的Optional,否则返回空Optionalo读到这里,可能你已经知道如何为filter方法传入一段代码。是的,这里可以传入一个lambda表达式。对于filter函数我们应该传入实现了Predicate接口的1ambda表达式。如果你不熟悉Predicate接口,可以参考这篇文章。现在我來看看filter的各种用法,下面的示例介绍了满足限定条件和不满足两种情况://filter方法检查给定的Option值是否满足某些条件。//如果满足则返冋同一个Option实例,否则返冋空OptionalcOptionallongName二name.filter((value)->value,length()>6);System,out.printin(longName.orElse(^Thenameislessthan6characters"));〃输出Sanaulla//另一个例子是Optional值不满足filter指定的条件。OptionalanotherMame二Optional.of(,zSana〃);OptionalshortName二anotherName.fi1ter((value)->valuc.lcngth()>6);//输岀:name长度不足6字符System,out.printin(shortName.orElse(,zThenameislessthan6characters"));以上l我们介绍了Optional类的各个方法。下面通过一个完整的示例对用法集中展不:publicclassOptionalDemo{publicstaticvoidmain(String[]args){//创建Optional实例,也口J以通过方法返回值得到。Option31〈String>name=Optionei1.of("SeindullET);//创建没有值的Optional实例,例如值为'null'Optionalempty=Optional.ofNullable(null);//isPresent方法用來检查Optional实例是否冇值。 if(namc.isPrcscnt()){//调用get()返回Optional值。System,out.printIn(name,get());}try{//在Optional实例上调用get()抛出NoSuchElcmcntExccptionoSystem・out・printin(empty・get());}catch(NoSuchElementExceptionex){System,out.println(ex.getMessage());}//ifPresent方法接受lambda表达式参数。//如果Optional值不为空,lambda表达式会处理并在其上执行操作。name.ifPresent((value)->{System,out.print!nC^Thelengthofthevalueis:"+valuc.length());});//如果有值orElse方法会返冋Optional实例,否则返冋传入的错误信息。System,out.printin(empty.orElse(^Thereisnovaluepresent!z,));System.out.printin(namc.orElsc(,zThcrcissomevalue!"));//orElseGet与orElse类似,区别在于传入的默认值。//orElseGet接受lambda表达式生成默认值。System,out.printin(empty.orElseGet(()->"DefaultValue"));System.out.printin(namc.orElscGct(()->''DefaultValue"));try{//orElseThrow与orElse方法类似,区别在于返冋值。//orElseThrow抛出曲传入的1ambda表达式/方法生成异常。empty・orElseThrow(ValucAbscntExccption::ncw);}catch(Throwableex){System,out.printin(ex.getMessage());}//map方法通过传入的lambda表达式修改Optonal实例默认值。//lambda表达式返回值会包装为Optional实例。OptionalupperName=name,map((value)->value.toUpperCase());System,out•println(upperName・orElse("Novaluefound"));//flatMap与map(Funtion)非常相似,区别在于lambda表达式的返冋值。//map方法的lambdo表达式返回值可以是任何类型,但是返回值会包装成Optional实例。//但是flatMap方法的lambda返回值总是Optional类型。upperName=name.flatMap((value)->Optional,of(value.toUpperCase())); System,out.printin(upperName.orElse(〃Novaluefound〃));//filter方法检杳Optiona值是否满足给定条件。//如果满足返回Optional实例值,否则返回空Optional。OptionallongName=name,filter((value)->value,length()>6);System,out•println(longName.orElse(Z/Thenameis1essthan6characters,z));//另一个示例,Optional值不满足给定条件。OptionalanotherName二Optional.of(〃Sana〃);OptionalshortName=anotherName.filter((value)->value,lcngth()>6);System,out.println(shortName.orElse(z,Thenameislessthan6characters^));上述代码输出如下:SanaullaNovaluepresentThelengthofthevalueis:8Thereisnovaluepresent!SanaullaDefaultValueSanaullaNovalueprosentintheOptioneilinstanccSANAULLASANAULLASanaullaThenameis1essthan6characters原文链接:javacodegeeks翻译:ImportNew.com-高俊阳译文链接:http://www.importnew.com/6675.html[转载请保留原文出处、译者和译文链接。]关于作者:高俊阳(新浪微博:@狐狸叔) 查看高俊阳的更多文章»

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭