JDK8新特性笔记(二):Optional
Optional类主要用于解决空指针异常的问题
代码例子:
public class OptionalDemo01 {
public static void main(String[] args) {
Person ps = new Person();
Optional<Person> ps2 = Optional.of(ps);
System.out.println("ps2"+ps2);
Optional<Person> ps1 = Optional.ofNullable(ps);
if (ps1.isPresent()) {
System.out.println("optinal对象不为空");
System.out.println(ps1.get());
System.out.println(ps1.get().age+"----------"+ps1.get().name);
}else {
System.out.println("optinal对象为空");
}
}
}
运行结果:
ps2Optional[chapter1.optional_demo.Person@12a3a380]
optinal对象不为空
chapter1.optional_demo.Person@12a3a380
0----------null
- of(): 如果null值作为参数传入则会抛异常
Optional ps2 = Optional.of(ps);
如果传入的非null则会返回 Optional[]括号内为对象实例
- ofNullable(): 不知道传入对象是否为null可用
Optional ps1 = Optional.ofNullable(ps);
如果传入的非null则会返回 Optional[]括号内为对象实例,这里和of()类似,但这里传入为null不会抛异常,后面可以在进行进一步判断和处理。
- isPresent():如果对象不为null则返回true,否则为false
- **get():用于拿到对象,如果是null会抛异常,一般和isPresent()配合使用 **
Optional<Person> ps1 = Optional.ofNullable(ps);
if (ps1.isPresent()) {
System.out.println("optinal对象不为空");
System.out.println(ps1.get());
System.out.println(ps1.get().age+"----------"+ps1.get().name);
}else {
System.out.println("optinal对象为空");
}
判断不为空后,就用get()拿到对象,然后就可以调用对象内的get/set构造等方法
- 兜底 orElse() 用于如果拿到的对象为null则传递一个默认值得情况
Person person1 = null;
Person personDemo = new Person("xiaogui",12);
Person person = Optional.ofNullable(person1).orElse(personDemo);
System.out.println("name:"+person.getName()+";age:"+person.getAge());
运行结果:
name:xiaogui;age:12
这种就是有对象传入就用传入的对象没有就把自己创建的默认的传入。
使用lambda表达式+orElse()的一个例子:
Person person1 = null;
Person personDemo = new Person("xiaogui",12);
Integer integer = Optional.ofNullable(person1).map(obj -> obj.getAge()).orElse(7);
System.out.println(integer);
Integer integer2 = Optional.ofNullable(person1).map(obj -> obj.getAge()).orElse(7);
System.out.println(integer2);
运行结果:
7 //这是第一个传入null的结果
12 //这是传入第二个有初始值对象personDemo的结果