求求你不要在用!=null判空了
导语
在没有用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")); // 输出orElse
7.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); //输出: XIAOMING
10.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()); //输出:XIAOMING
11.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更少的应用程序。好了,今天就到这里了,喜欢的朋友,请关注小编,与小编共同成长!
- Shell系列-Shell概述
- sqoop2系统入门之2汇总:用户指南shell命令
- 深入解析golang编程中函数的用法
- MySQL数据库(一):安装MySQL数据库
- Spring Security入门(二):基于数据库验证
- flume搜集日志:如何解决实时不断追加的日志文件及不断增加的文件个数问题
- hduoj-----(2896)病毒侵袭(ac自动机)
- MySQL数据库(二):基本管理
- Golang编程实现生成n个从a到b不重复随机数的方法
- TiDB 在株式会社 FUNYOURS JAPAN 的应用
- MySQL数据库(三):数据类型
- spark开发环境详细教程2:window下sbt库的设置
- hdu----(2222)Keywords Search(ac自动机)
- MySQL数据库(四):约束条件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 工作中使用jasmine遇到的一个html element和Component绑定属性失去同步的问题
- Android使用Volley框架定制PostUploadRequest上传文件
- Android实现横向滑动卡片效果
- 在jasmine beforeEach里修改UI元素的一个side effect
- Android实现头像上传功能
- 关于jasmine里debugElement.query和fixture.detectChanges的依赖关系
- 使用python批量转换文件编码为UTF-8的实现
- rxjs operator学习笔记
- python实现将两个文件夹合并至另一个文件夹(制作数据集)
- rxjs里使用from operator从一个generator里生成Observable
- 使用asyncScheduler进行Observable的延迟subscribe
- 解决flask接口返回的内容中文乱码的问题
- Android自定义控件实现带数值和动画的圆形进度条
- rxjs interval和take的混合使用
- Android自定义控件实现带文本与数字的圆形进度条