点击上方“码农突围”,马上关注
这里是码农充电第一站,回复“666”,获取一份专属大礼包
真爱,请设置“星标”或点个“在看”
导语
在没有用Optional判空之前,你是否也像下面的代码一样判空呢?如果是,请往下看,Optional 相对传统判空的优势。
java8之Optional 判空,简化判空操作传统阶层判空
为什么要用Optional,它到底是什么东西
你也看到了上面的那张图,一旦代码量大起来了,条件多了,代码就会变得很冗余,变得难以维护。那么此时我们就有必要了解Optional了。
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。
Optional 的方法,如下图
java8之Optional 判空,简化判空操作Optional方法-图1
java8之Optional 判空,简化判空操作Optional方法-图2
好,方法就是这么多,其他的也不必多说,相信各位小伙伴一看就懂;如何使用,我还是用代码演示,请往下移步。
Optional实例
1.of:为非null的值创建一个Optional。of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。
Optional<String> optional = Optional.of("xiaoming"); //传入null,抛出NullPointerException Optional<Object> o = Optional.of(null);2.ofNullable:为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
Optional<Object> o1 = Optional.ofNullable(null);3.isPresent:值存在返回true,否则返回false
Optional<String> optiona2 = Optional.of("xiaoming"); System.out.println(optiona2.isPresent());4.get:Optional有值就返回,没有抛出NoSuchElementException
Optional<Object> o1 = Optional.ofNullable(null); System.out.println(o1.get());5.ifPresent:如果Optional有值则调用consumer处理,否则不处理
Optional<Object> o1 = Optional.ofNullable(null); o1.ifPresent(s -> System.out.println(s));6.orElse:如果有值则将其返回,否则返回指定的其它值
Optional<Object> o1 = Optional.ofNullable(null); System.out.println(o1.orElse("输出orElse")); // 输出orElse7.orElseGet:orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
Optional<Object> o1 = Optional.ofNullable(null); System.out.println(o1.orElseGet(() -> "default value")); // default value*注意:orElse 和 orElseGet 看似差不多,其实有很大不同;看下面例子
Shop shop = null; System.out.println("test orElse"); Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet"); Optional.ofNullable(shop).orElseGet(()->createNew()); //createNew private static Shop createNew() { System.out.println("create new"); return new Shop("丝袜", 50); }//输出: test orElsecreate newtest orElseGetcreate new Shop shop = new Shop("长腿丝袜",100); System.out.println("test orElse"); Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet"); Optional.ofNullable(shop).orElseGet(()->createNew()); //输出 test orElsecreate newtest orElseGet从上面两个例子可以看到,当Optional 为空时,orElse和orElseGet 区别不大,但当Optional有值时,orElse仍然会去调用方法创建对象,而orElseGet不会再调用方法;在我们处理的业务数据量大的时候,这两者的性能就有很大的差异。
8.orElseThrow:如果有值则将其返回,否则抛出supplier接口创建的异常。
Optional<Object> o1 = Optional.ofNullable(null); try { o1.orElseThrow(() -> new Exception("异常!")); } catch (Exception e) { System.out.println("info:" + e.getMessage()); }//输出:info:异常!9.map:如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
Optional<String> optional = Optional.of("xiaoming"); String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng"); System.out.println(s); //输出: XIAOMING10.flatMap:如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。与map不同的是,flatMap 的返回值必须是Optional,而map的返回值可以是任意的类型T
Optional<String> optional = Optional.of("xiaoming"); Optional<String> s = optional.flatMap(e -> Optional.of(e.toUpperCase())); System.out.println(s.get()); //输出:XIAOMING11.filter
List<String> strings = Arrays.asList("rmb", "doller", "ou"); for (String s : strings) { Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o")); System.out.println(o.orElse("没有不包含o的")); }//输出: rmb 没有不包含o的 没有不包含o的小结
Optional 是java非常有用的一个补充,它旨在减少代码中的NullPointerExceptions,虽然不能百分之百的消除,但也是精心设计的。使用Optional 能更好的帮助我们创建可读性强,bug更少的应用程序。好了,今天就到这里了,喜欢的朋友,请关注小编,与小编共同成长!
作者:诗意凌风 | http://suo.im/5t3akh
最后,这里再跟大家推荐一本程序员必知的硬核基础知识,这是一本非常入门的经典 PDF,看完能让你对计算机有一个基础的了解和入门,是培养你 内核 的基础,我们看下目录大纲基本上涵盖了计算机所有基础知识,从 CPU 到内存、讲解什么是二进制、磁盘、压缩算法、操作系统、汇编等知识。
我们来看下内容是怎样的
这个图画的很漂亮啊,看起来就是作者在用心画的,而且排版非常精美。
看起来一点不枯燥
现在这本 PDF 免费分享给你,你可以扫描下方二维码回复 计算机基础 来领取这本 PDF。
▲长按二维码进行关注▲
▲回复「计算机基础」,获取PDF
最近热文• 外包公司干了不到 3 个月,我裸辞了!• 为什么我强烈建议大家使用 Linux 开发?• 灵魂一问:一个TCP连接可以发多少个HTTP请求?• 保送北大,连发三篇Science,这位80后川妹子近日再发重磅级研究成果! 最近整理了一份大厂算法刷题指南,包括一些刷题技巧,在知乎上已经有上万赞。同时还整理了一份6000页面试笔记。关注下面公众号,在公众号内回复「刷题」,即可免费获取!回复「加群」,可以邀请你加入读者群! 明天见(。・ω・。)ノ♡