Optional 容器类:用于尽量避免空指针异常
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
@Test
public void test06(){
Optional<Student> op=Optional.ofNullable(null);
Optional<Integer> map = op.flatMap((e)->Optional.of(e.getAge()));
System.out.println(map);//Optional.empty
Optional<Student> op1=Optional.ofNullable(null);
Optional<Integer> map1 = op1.flatMap((e)->Optional.of(e.getAge()));
System.out.println(map1.orElse(12));//12
}
@Test
public void test05(){
Optional<Student> op=Optional.ofNullable(null);
Optional<Integer> map = op.map((e)->e.getAge());
System.out.println(map);//Optional.empty
Optional<Student> op1=Optional.ofNullable(new Student("丽丽"));
Optional<String> map1 = op1.map((e)->e.getName());
System.out.println(map1);//Optional[丽丽]
}
@Test
public void test04(){
Optional< Student> op=Optional.ofNullable(new Student("王丽"));
Student orElseGet = op.orElseGet(()->{
Student s=new Student("莉莉",12,"ss");
return s;
});
System.out.println(orElseGet);//Student [getName()=王丽, getAge()=0, getSex()=null]
Optional< Student> op2=Optional.ofNullable(null);
Student orElseGet2 = op2.orElseGet(()->{
Student s=new Student("莉莉",12,"ss");
return s;
});
System.out.println(orElseGet2);//Student [getName()=莉莉, getAge()=12, getSex()=ss]
}
@Test
public void test03(){
Student s=null;
Optional<Student> op2 = Optional.ofNullable(s);
System.out.println("op2==="+op2.isPresent());
if(!op2.isPresent()){
System.out.println(op2.orElse(new Student()));
}
/**
*
Student [getName()=null, getAge()=0, getSex()=null]
*/
}
@Test
public void test02(){
Student s=null;
Optional<Student> op1 = Optional.ofNullable(s);
//System.out.println(op1.get());//null
System.out.println(op1.orElse(new Student()));
}
@Test
public void test01(){
Optional<Student> of = Optional.of(new Student());
System.out.println("op"+of.get());
}
总结
:使用Optional能更好避免空指针的出现,虽然说还得写代码进行判断,但无疑这个容器类可以使我们少写if,else,增强了代码可读性(讲真if我是不喜欢的),和Lambda也可以在一起使用,在进行复杂自定对象获取做默认的时候也简化了代码。