安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

Java8特性Optional类源码阅读

12月8日 听风行投稿
  Optional类隶属于java。util包中
  Optional类是一个可以为null的容器对象,它的出现很好的解决空指针异常。
  简而言之,这个类的出现,相当于Java8提供了一个封装好的容器,在使用的时候可以放心大胆的处理null的逻辑或异常。需要把值放入容器中,后续的取值操作和其他逻辑,使用其提供的Api即可方便简单的处理null指针的情况。
  Optional类的源码数量并不多,有时间还是可以看看的,先看看3个初始化容器内容的静态方法,(empty,of,ofNullable),由于所有构造函数都是private的,所以只能使用工厂方法来获取Optional的实例
  在类中第一行便是定义了一个静态常量EMPTY,泛型的使用的是通配符?,意思是可以传入任意类型,并赋值为空参构造实例,第二行定义为final的value,则是用于存储放入容器中的值Commoninstancefor{codeempty()}。privatestaticfinalO?EMPTYnewOptional();Ifnonnull,ifnull,indicatesnovalueispresentprivatefinalTprivateOptional(){this。}静态方法empty
  这个方法作用很简单,就是将类加载时初始化的EMPTY静态常量强转成传入的泛型T,然后返回强转后的值,可以调用该方法返回一个值为null的Optional容器publicstaticTOptionalTempty(){SuppressWarnings(unchecked)OptionalTt(OptionalT)EMPTY;}
  使用方式,声明一个value类型为String的空容器OptionalStringemptyOptional。empty();静态方法of
  这个方法相当于要求传入一个值,该值会做为容器中的值,调用顺序是传入值后,调用Optional的构造方法,而构造方法会调用Objects。requireNonNull方法去判断传入的值是否为空,如果为空则直接抛出空指针异常NullPointerException,不为空则返回值并赋值给成员属性valuepublicstaticTOptionalTof(Tvalue){returnnewOptional(value);}privateOptional(Tvalue){this。valueObjects。requireNonNull(value);}
  构造函数中调用的Objects类的requireNonNull方法publicstaticTTrequireNonNull(Tobj){if(objnull)thrownewNullPointerException();}
  使用方式,声明一个容器,并且值为123,通过实例方法get可以获取出使用of方法初始化的值OptionalIntegeraOptional。of(123);Integerintegera。get();静态方法ofNullable
  这个方法逻辑比较简单,判断传入的值是否为空,为空则调用上面说的empty方法,不为空则调用上面说的of方法publicstaticTOptionalTofNullable(Tvalue){returnvaluenull?empty():of(value);}下面看看一些实例方法是怎么实现的get方法
  在of方法中演示过用法了,其作用就是返回当前容器中value的值,如果为value为空则直接抛出NoSuchElementException异常publicTget(){if(valuenull){thrownewNoSuchElementException(Novaluepresent);}}isPresent方法
  判断当前容器中value的值是否为空,并返回一个boolean值publicbooleanisPresent(){returnvalue!}
  使用:先判断值是否为空,如果为空直接调用get方法会报错if(optional。isPresent()){poptional。get();}ifPresent方法
  判断当前容器中value的值是否为空,空则什么都不做,不为空则将value传入Consumer的accept中执行publicvoidifPresent(C?superTconsumer){if(value!null)consumer。accept(value);}
  java。util。function。Consumer是JDK提供的函数接口,包含了一个无返回值的带参的方法:voidaccept(Tt),传入一个泛型类型的参数并执行一些操作。由于这是一个函数式接口,可以使用传统的匿名内部类编写,也可以使用Lambda表达式,函数接口和Lambda表达式在这里不再赘述FunctionalInterfacepublicinterfaceConsumerT{Performsthisoperationonthegivenargument。paramttheinputargumentvoidaccept(Tt);}
  使用:分别采取了匿名内部类和lambda表达式的方式编写,由于value不为null,所以都会执行accept方法并输出test字符串OptionalStringdataOptional。of(test);data。ifPresent(newConsumerString(){Overridepublicvoidaccept(Strings){System。out。println(s);}});data。ifPresent(System。out::println);orElse方法
  判断当前容器中value的值是否为空,不为空则返回value,空则返回传入的值publicTorElse(Tother){returnvalue!null?value:}
  使用:由于容器中的值为空,所以会返回test字符串OptionalStringemptyOptional。empty();System。out。println(empty。orElse(test));orElseGet方法
  判断当前容器中value的值是否为空,不为空则返回value,空则调用Supplier实例的get方法,?extendsT的作用为返回值类型只能是T类型或T的子类型publicTorElseGet(S?extendsTother){returnvalue!null?value:other。get();}
  java。util。function。Supplier是JDK提供的函数接口,包含了一个无参的方法:Tget(),用来返回一个泛型参数指定类型的对象FunctionalInterfacepublicinterfaceSupplierT{Getsaresult。returnaresultTget();}
  使用:分别采取了匿名内部类和lambda表达式的方式编写,由于value的值为null,所以最终返回值都是Supplier实例的get方法返回值OptionalStringemptyOptional。empty();Stringanonymityempty。orElseGet(newSupplierString(){OverridepublicStringget(){}});Stringlambdaempty。orElseGet(()lambda);System。out。println(anonymity);System。out。println(lambda);输出两行字符串,anonymity和lambdaorElseThrow方法
  和orElseGet类似,泛型函数的泛型作用为返回值类型只能是Throwable类型或Throwable的子类型,如果值为空,则直接抛出一个异常publicXextendsThrowableTorElseThrow(S?extendsXexceptionSupplier)throwsX{if(value!null){}else{throwexceptionSupplier。get();}}
  使用:分别采取了匿名内部类和lambda表达式的方式编写,由于value的值为null,所以最终返回值都是Supplier实例的get方法返回值,可以直接往上抛异常或者trycatch捕获处理,这段代码执行后便会抛出任意一个异常publicstaticvoidmain(String〔〕args)throwsException{OptionalObjectemptyOptional。empty();这段注释掉则抛出后面的lambda表达式返回的异常empty。orElseThrow(newSupplierException(){OverridepublicIllegalArgumentExceptionget(){returnnewIllegalArgumentException(valueisnull,fromanonymity);}});这段注释掉则抛出匿名内部类返回的异常empty。orElseThrow((SupplierException)()newIllegalArgumentException(valueisnull,fromlambda));}map方法
  首先判断参数mapper是否为空,空则抛出空指针异常,再判断当前容器中value的值是否为空,空则调用empty方法,不为空则返回ofNullable方法的返回值,ofNullable的参数为mapper的返回值,mapper类型为Function类型,和上面讲过的Supplier类似,作用就是如果值不为空,可以执行一个函数进行二次逻辑数据处理并返回。这个mapper函数有两个泛型T和U,T是定义在Optional类名上的,public后面紧跟的作用是声明这个方法有一个泛型U(声明为泛型方法),Function的泛型参数则限定了第一个参数为T类型或T的父类型,第二个参数为U类型或U的子类型publicUOptionalUmap(F?superT,?extendsUmapper){Objects。requireNonNull(mapper);if(!isPresent())returnempty();else{returnOptional。ofNullable(mapper。apply(value));}}
  java。util。function。Function是JDK提供的函数接口,方法applay的作用就是传入一个值,返回另一个值FunctionalInterfacepublicinterfaceFunctionT,R{Appliesthisfunctiontothegivenargument。paramtthefunctionargumentreturnthefunctionresultRapply(Tt);}
  使用:分别采取了匿名内部类和lambda表达式的方式编写,由于value的值不为空,两个变量接受的Optional实例中的值都为3OptionalStringdataOptional。of(test);OptionalIntegerintegerdata。map(newFunctionString,Integer(){OverridepublicIntegerapply(Strings){returns。length()3?1:0;}});OptionalIntegerinteger2data。map(ss。length()3?1:0);System。out。println(integer。get());System。out。println(integer2。get());输出两行字符串3flatMap方法
  首先判断参数mapper是否为空,空则抛出空指针异常,再判断当前容器中value的值是否为空,空则调用empty方法,不为空则调用Objects。requireNonNull函数的返回值,将mapper。apply返回值传入,如果apply方法的返回值为空则会抛出异常,使用的方法与map非常类似,唯一区别是map返回值会被调用ofNullable方法进行容器包装,而flatMap要求直接返回Optional容器publicUOptionalUflatMap(F?superT,OptionalUmapper){Objects。requireNonNull(mapper);if(!isPresent())returnempty();else{returnObjects。requireNonNull(mapper。apply(value));}}
  使用:分别采取了匿名内部类和lambda表达式的方式编写,使用匿名内部类编写的applay方法返回了一个值为数字1的容器,可调用get输出,使用lambda表达式编写的因为执行Objects。requireNonNull(null)所以抛出异常OptionalStringdataOptional。of(test);OptionalIntegerintegerdata。flatMap(newFunctionString,OptionalInteger(){OverridepublicOptionalIntegerapply(Strings){returnOptional。of(1);}});System。out。println(integer。get());输出字符串1data。flatMap(snull);执行到这里就会抛出异常,因为调用了Objects。requireNonNull(null)filter方法
  首先判断参数predicate是否为空,空则抛出空指针异常,再判断当前容器中value的值是否为空,空则返回当前实例,不为空则返回一个三元表达式,会将当前容器的值传入predicate。test函数中,返回一个boolean值,如果true则返回当前实例,否则调用empty函数返回一个空容器,作用就是过滤筛选值。Predicate也是一个函数接口。publicOptionalTfilter(P?superTpredicate){Objects。requireNonNull(predicate);if(!isPresent())elsereturnpredicate。test(value)?this:empty();}
  java。util。function。Predicate是JDK提供的函数接口,方法test的作用就是传入一个值,返回一个boolean值FunctionalInterfacepublicinterfacePredicateT{Evaluatesthispredicateonthegivenargument。paramttheinputargumentreturn{codetrue}iftheinputargumentmatchesthepredicate,otherwise{codefalse}booleantest(Tt);}
  使用:分别采取了匿名内部类和lambda表达式的方式编写,由于rightly的value值不为空,会输出test,而falsely。get()则会抛出异常OptionalStringdataOptional。of(test);OptionalStringrightlydata。filter(newPredicateString(){Overridepublicbooleantest(Strings){returns。equals(test);}});OptionalStringfalselydata。filter(ss。equals());System。out。println(rightly。get());System。out。println(falsely。get());会先输出一次test然后falsely。get时就会抛出异常,因为value为null至此,Optional类中所有的方法和逻辑都阅读完了,源码清晰简单,阅读一遍明白其中的逻辑,对该工具类的使用会有一定的帮助。:)
投诉 评论 转载

这次不是开玩笑,安卓全价位霸主来了,iPhone全家一起上也自发布以来,Iphone13系列的势头可谓是非常猛,双十一一举拿下某东单一机型销量榜第二的战绩,各大科技数码论坛上也无一不在刷13香,一部5000起售的机型能够有如此好的口碑与……深入理解jvm原理之逃逸分析最近一直在学习Java虚拟机原理,觉得有意思的地方就写个文章记录下来。优胜劣汰是自然界的发展,适用到Java虚拟机也不为过,jvm过了生存下去,一直在自我进化,Java虚拟机也……aigo多功能无线充插座M0230T为桌面添加一丝现代化艺术什么叫桌面上的美学文化?相信很多人都听过音乐美学、舞蹈美学、戏剧美学等专业名词,但唯独对桌面上的美学文化,有点大惑不解。实际上,桌面美学文化在目前已经成为了各大数码论坛网……最简单的装电脑系统的方法有哪些?最简单的?装系统最常见的两种,一是通过PE启动盘来安装系统,另一种是纯原版系统U盘来安装系统。(在线安装等不建议,属于桌面级安装,不推荐使用。)这两种安装都是通过U……小米12系列登陆全球,西方媒体评价小米能和市面最好的手机抗衡小米集团成立于2010年4月,2018年7月9日在香港交易所主板挂牌上市,是一家以智能手机、智能硬件和IoT平台为核心的消费电子及智能制造公司。胸怀和用户交朋友,做用户心……4月销量近乎腰斩,特斯拉ModelY为啥卖不动了?文凌清、刘帅图车宇世界、网络温馨提示:车宇世界,只做最真实的车评。有问题,来投稿,我们本年度开通车主来稿栏目,欢迎交流。作为全球电动车巨头,凭借在中国车市的喜人表现……神舟十二号乘组两名航天员已成功出舱来源:央视新闻客户端据中国载人航天工程办公室消息,北京时间2021年8月20日8时38分,航天员聂海胜成功开启天和核心舱节点舱出舱舱门,截至10时12分,航天员聂海胜、航……Java8特性Optional类源码阅读Optional类隶属于java。util包中Optional类是一个可以为null的容器对象,它的出现很好的解决空指针异常。简而言之,这个类的出现,相当于Java……农村又传出新消息,部分快递网点要撤走?这两种替代方案已出大家好,我是村官小焦!随着互联网在农村的大力普及,很多农民已经学会了网购,而快递网点在农村的延伸,让越来越多的农民享受着送货上门的优质服务,农民朋友在家里就能收到自己心仪……关于征集机器人典型应用场景的通知各有关单位:为加快推动机器人产业发展,现面向全市征集机器人典型应用场景(以下简称典型场景),形成一批可复制可借鉴的成果并加强推广应用。同时,引导机器人企业与使用单位加强合……超高颜值硬核实力美的元气集成套系轻装上阵,加码年轻化虎年春节前夕,美的集成灶拿出了开年诚意新作美的元气集成套系!由蒸烤一体集成灶元气TX05集成水槽净洗机元气TX75,这两款产品搭配组合,元气出道!纯白的配色,轻巧的体积,……雷军的年度演讲,却让这只狗抢了风头8月10日,小米的秋季新品发布会,近3小时的直播,不知道各位看完后,印象最深刻的是什么?是被众多米粉期待已久,却被提前曝光泄露的小米MIX4?还是停滞3年后,梦回1……
刘邦没有给戚夫人留后路?戚夫人的愚蠢让她失去了唯一的依靠假如袁崇焕不死解放海南岛,李作鹏的部下率领加强营率先偷渡,38年后授中将那些在汉末乱世中率先抢得好开局的人,为何却早早地凉了?古代人说虎生三子,必有一彪。那么彪是什么?跟普通的小老虎有什红军女团长王泉媛被俘后,被迫做妾遭辱,五十年后再见前夫72年李敏二胎,把女儿照片寄给爸爸起名,毛主席把我的东字给她再看老电影,重温红色经典(六)安史之乱本来已让唐玄宗惊惶不已,为何李亨还要趁机夺取皇位战国七雄秦楚齐燕赵魏韩,分别在哪些省份,有你家乡吗?英国曾经准备48枚核武器,想要攻击中国,为何最终没动手?江洋大盗敢偷冈村宁次,刺杀北平市长,最终栽在罗瑞卿手中

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利