一、 概述
Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常(NPE)。
Optional<T>是一个可以包含或不可以包含非空值的容器对象。
二、 介绍常用
1. Optional.of(T t)
创建一个Optional实例,若为null,则会引起空指针
2. Optional.empty()
创建一个空的Optional实例
3. Optional.ofNullable(T t)
若t不为null,创建Optional实例,否则创建空实例
4. isPresent()
判断是否包含值,如果值存在则方法会返回true,否则返回 false。
5. voidifPresent(Consumer<? super T> consumer)
如果值存在则使用该值调用 consumer , 否则不做任何事情。
6. orElse(T t)
如果调用对象包含值,返回该值,否则返回t
7. orElseGet(Supplier s)
如果调用对象包含值,返回该值,否则返回s获取的值
8. map(Function f)
如果有值对其处理,并返回处理后的Optional,否则返Optional.empty()
9. flatMap(Function mapper)
与map类似,要求返回值必须是Optional
10. orElseThrow(Supplier<?extends X> exceptionSupplier)
如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
三、 举例说明
类People、OptionalTest构建例子。
publicclass People {
private Integer no;
private String name;
private String mobile;
private Integer age;
private Double sal;
public People(){
this.no=0;
this.name = "ming";
this.mobile = "121212121";
this.age = 28;
this.sal = 1999999.99;
}
public People(String name){
this.no=1;
this.name = name;
this.mobile = "121212121";
this.age = 28;
this.sal = 1999999.99;
}
public People(Integer no,String name, String mobile, Integer age){
this.no=2;
this.name = name;
this.mobile = mobile;
this.age = age;
this.sal = 999999.99;
}
public People(Integer no,String name, Integer age,Double sal){
this.no=no;
this.name = name;
this.mobile = "22222222";
this.age = age;
this.sal = sal;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public String getMobile() {
returnmobile;
}
publicvoid setMobile(String mobile) {
this.mobile = mobile;
}
public Integer getAge() {
returnage;
}
publicvoid setAge(Integer age) {
this.age = age;
}
public Double getSal() {
returnsal;
}
publicvoid setSal(Double sal) {
this.sal = sal;
}
public Integer getNo() {
returnno;
}
publicvoid setNo(Integer no) {
this.no = no;
}
}
/**
* 测试Optional
*
*/
publicclass OptionalTest {
publicstaticvoid main(String args[]){
OptionalTest test = new OptionalTest();
try{
test.test1();
}catch(Exception e){
System.out.println(e.getMessage());
}
try{
test.test2();
}catch(Exception e){
System.out.println(e.getMessage());
}
test.test3();
test.test4();
}
//of
publicvoid test1() {
Optional<People> op = Optional.of(new People());
//正常输出
System.out.println(op.get());
Optional<People> op1 = Optional.of(null);
//空指针异常
System.out.println(op1.get());
}
//empty
publicvoid test2() {
Optional<People> op = Optional.empty();
//java.util.NoSuchElementException
//不会出现空指针异常
System.out.println(op.get());
}
//ofNullableorElse orElseGet
publicvoid test3() {
Optional<People> op = Optional.ofNullable(new People());
//如果有元素,不是空或null
if(op.isPresent()) {
System.out.println(op.get());
}
People emp = op.orElse(new People("张三"));
System.out.println(emp);
//与orElse区别在于他接收一个函数式接口,可以写自己逻辑,比如if true
//返回A对象,else 返回B对象
People emp2 = op.orElseGet(() -> new People());
System.out.println(emp2);
}
//mapflatMap
publicvoid test4(){
Optional<People> op = Optional.of(new People(101, "王五", 18, 9999.99));
Optional<String> op2 = op.map(People ::getName);
System.out.println(op2.get());
Optional<String> op3 = op.flatMap((e) -> Optional.of(e.getName()));
System.out.println(op3.get());
}
}
输出结果如下:
com.xhdx.java8.People@2a139a55
null
No value present
com.xhdx.java8.People@15db9742
com.xhdx.java8.People@15db9742
com.xhdx.java8.People@15db9742
王五
王五
关注我们,精彩属于你