《34Java GC面试题及答案(第5题).docx》由会员分享,可在线阅读,更多相关《34Java GC面试题及答案(第5题).docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java GC面试题及答案(第5题) Java8中的Optional类的解析身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能亘接将返回值作为参数去调用别的方法。我们首先 要判断这个返回值是否为null ,只有在非空的前提下才能将其作为其他方法的参数.这正是一些类似Guava的外部API试图解决的问题. 一些JVM编程语言比方Scala. Ceylon等已经将对在核心API中解决了这个问题.在之前一篇文章中,介绍了 Scala是如何解决了这 个问题.新版本的Java ,比方Java 8引入了一个新的Optional类.Optional类的Javadoc描述如下:这是
2、可以为null的容器对配 如果值存在那么isPresent()方法会返回true ,调用get。方法会返回该对象。下面会逐个探讨Optional类包含的方法,并通过一两个例如展示如何使用.方法 1: Optional.ofO作用:为非null的值创立T Optional.说明:of方法通过工厂方法创立Optional类,需要注意的是,创立对象时传入的参数不能为null.如果传入参数为null,那么抛出 NullPointerException.Pptional name = Optional.of(*Sanaibptional someNull - Optional.of()方法 2 : Op
3、tional.ofNullableO作用:为指定的值创立一个Optional,如果般的值为null,那么返回一个空的Optional.说明:ofNullable与of方法相似,唯一的区 别是可以接受参数为null的情况.ptional em匚ionml.ofNullabla 方法 3 : Optional.isPresentO作用:判断预期值是否存在说明:如果值存在返回true ,否那么返回false.ptional name = Optional.of( Sanau 11a ) ; (name.isPresent()(System.out.printIn(name.get();System.
4、out.printIn(name.get();方法 4 : OptionaLgetO作用:如果Optional有值贝照其返回,否那么抛出NoSuchElementException.说明:上面的例如中,get方法用来得到Optional实例中的值.下面我们看一个抛出NoSuchElementException的例子tional emtional emtional.ofNullable(NoSuchElementException ex)rstem out , pr intIn(exgecMessage();方法 5 : Optional.ifPresentO作用:如果Optional实例有值那
5、么为其调用consumer,否那么不做处理说明:要理解ifPresent方法,首先需要了解Consumer类。简答地说,Consumer类包含一个抽象方法。该抽象方法对传入的值进行 处理,但没有返回值.Java8支持不用接口直接通过lambda表达式传入参数,如果Optional实例有值,调用ifPresent。可以接受接口 段或lambda表达式ptional name - Optional.。 SannuUa);stem,outprintln( The length of ihe value is: + value.length ();m方法 6 : OptionaLorElseO作用:如
6、果有值那么将其返回,否那么返回指定的其它值.说明:如果Optional实例有值那么将其返回,否那么返回orElse方;加入的参数。例如如下:ntionalStringnama = Optional,of( Sanuulld );)ptional someNull = Optional of ()ptional someNull = Optional of (l,oi门se万龙迦网 如Mona:实例的值 /如果内区回传入白(System.out .println (empty .orElse (There i、 no value present!);ystem.out .printIn (nam
7、e.orElse ( There is some value!);方法 7 : Optional.orElseGet()作用:如果有值那么将其返回,否那么返回指定的其它值。说明mElseGet与。rElse方法类1以区另E于得到的默认值.。田se方法将传入的字符串作为默认值QrElseGet方法可以接受Supplier 接口的实现用来生成默认值ptional name = Optional.of( Sanaulla );Qptional someNull - Optionalof();rorElseGeC ()- IkfRult ValuerorElseGeC ()- IkfRult Valu
8、e一 ., ystem.out .println 喇ystem.out .printin (name. orElseGeE ( () - Defaull Vdlu(?);方法 8 : Optional.orElseThrow()作用:如果有值那么将其返回,否那么抛出supplier接口创立的异常.说明:在orElseGet方法中,我们传入f Supplier接口.然而,在orElseThrow中我们可以传入lambda表达式或方法,如果值不存在来抛出异常tional.ofhreir公跄出 hrnibdu 造式或力法卜衣的乔为emptyorElseThrowValueAbsentExceptio
9、n:) li (Throwable ex ( lu ( lunal.of (*Sanaul la”:为lambda表达式的返回方法的返叵值lonaKbLtName - namemap value.touppercase();ystem.out .printin (upperName .orElse ( o vi 1 ue found );方法 10 : Optional.flatMapQ作用:如果有值,为其执行mapping函数返回Optional类型返回值,否那么返回空Optional. flatM叩与map ( Funtion )方法类似, 区别在于flatMap中的mapper返回值必须
10、是Optional.调用结束时,flatMap不会对结果用Optional封装.说明:flatM叩方法与map方法类似,区别在于mapping函数的返回值不同.map方法的mapping函数返回值可以是任何类型T , 而flatMap方法的mapping函数必须是Optional.ptional name = Optional .of ( Sanaul la );rName - name.f1 atMdrName - name.f1 atMd(vame/ticnai.oi(valuetoUpperCase();ystem.out.printin(upperName.orElse ( o va
11、1 ue iound );方法 11 : Optional.filterO作用:如果有值并且满足断言条件返回包含该值的。ptional ,否那么返回空Optional.说明:他er个方法通过传入限定条件对Optional实例的值进行过说 这里可以传入lambda表达式。对于filter函数我们应该传 入实现了 Predicate接口的lambda哀达式.mal name-Optional.of ( Sanaul la); ptional longName-name.filter(value)-value.length()-;ystem.out .printinlongNmme.oirElsw
12、( The name is less Ihan 6 characiors );另一个例子是Optional值不满足filter指定的条件.3ptional shortName - anotherName.filter(value) - valuelength( 6 ;System.out .println (shortName.orElse (The nae is less ihan 6 characters)总结:Optional方法以上,我们介绍了 Optional类的各个方法.下面通过一个完整的例如对用法集中展示。 Min(SlringU arg挤:Oplionul 次例 上谢用 Xcl
13、OI他Hl sSuchElcmcrnExcept ion。 Sysicm. oui. primln(emp【y *t?i() (NoSuchElementExce如果Optional似不为宝,lambda表达应会处理并住具I.执仃像作nanie. ifPresent (value) 一)(System.out .printin (Th。 length of ihe value is:value.length ();?那么xi网传入的错i关信xiSystem.out.println(emptyorBlse( There is no value present!);System.out .prin
14、tin (name.orElse (*There is scr:* value! *);,】L1jGi1 及 Lmibdc 叱1、I成力、1人HlSystem.out.printin(empty.orElseGet( - *Default Value*);rintln (name.orElseGet () - Default Value );0rHMIhr。喘叮oHTse万法关:儿区刈1 J ;幺网似./orElseThrow抛出由传入的laabda表述式/方法生成片书.jorElseThrow 3%lueAbsentException:);(Throxable ex) out printIn
15、(ex gtMssag O);如果满足返回Optional实例值,否那么返回空Optional。m/p 小;.: 1,厂:川八 代述大港侑“八,二一门Cap 方法的 Lunhd,退“1总是 Opl ion可 关型upperNaine = naine . f IstzMap ( (value) 一 Optional .of (value. toUiName = name.filter(value) - value.lengSyscri. cut .printlr. (IcngNdcic .crElsc (/Tin- ruim- is lr chmciE、);tional anotherName =San.:);Optional shortName - anotherName.fi1 ter (value) - value.System. out. print In (shor tName. orElse (The tuimc is less than 6 characters*);