java8新特性五:Optinal

空指针异常可能占据了一半的异常发生率。因而oracle想用optional这类‘优雅的’解决null。想象挺美好,现实很残酷。显然optional并无使代码变得那么优雅。看了七八篇大神的博客,无论从代码量或者代码思想上都没有什么质的改变,你仍然要时刻担忧null的出现及给它相应的处理。若是你想统一处理还不如直接代码try catch  空指针异常。在我发现它真正对代码的改善前,暂且不推荐(不过阿里推荐,仍是人家牛,听阿里的吧)oracle

更新------------------------------------------------------函数

本着求真务实的精神,今天更加详细分析一下optional的使用方法。(根据实际开发,理论玩家无视)。指针

1,首先是构造方法 Optional.of(), Optional.ofNullable() ,Optional.empty()。对象

Optional.of():of方法在传入的参数为null时,抛出空指针异常。许多博客都说要在肯定参数不为null时使用。可要是肯定参数不为null,为何要用Optional。我的观点,Optional,的全部方法中,可能会抛出空指针异常的,都违背了使用Optional的初衷。如get()方法。开发

Optional.empty():构造一个空值值 optional,非特殊状况无使用价值。默认就使用ofNullable()方法构造。get

2,各方法的使用 博客

   ①isPresent() 根据是否为空返回boolean。一个挖坑又填坑的方法。直接判断参数==null?很差吗。it

   ②ifPresent(Consumer)  在对象不为空时,执行Consumer(函数表达式),空时不执行。至关于if(obj==null){.....},的简便写法。你可能会说这也没什么大用啊,个人硬盘又不在意多一行代码,再想写个else都不行。这个。。。。你说的对。 但这已是Optional中比较有用的方法了。io

   ③get() 获取optional中的值,空则抛出异常。前面说了,这个方法看不出来使用价值map

   ④orElse(T other) 若是为空,用other替代。一样可用一行if替代。但你可用来装一下

   ⑤orElseThrow  若是为空抛出异常。不想评价它

   ⑥map   若是你从一个对象中想获得第若干层的子对象,每一层都要都要空值校验如,Obj=obj1.get("obj2").get("obj3").get("obj4");上一个get方法返回的值为null时,下一个get方法执行时都会抛异常。因而就要写若干层if。map则容许进行链式操做,在最后才处理null值。这是optional最值得使用的方法。

Optional.ofNullable(userEntity1).map(u -> u.getUsername())
           .map(name -> name.toUpperCase()).orElse(null);
相关文章
相关标签/搜索