使用 Optional 解决 NPE(java.lang.NullPointerException)问题,它就是为 NPE
而生的,其中可以包含空值或非空值
```java
//原始案例
public String optional1(Person person){
if(person != null){
if(person.getStudent() != null){
String name = person.getStudent().getName();
if(name != null){
return name.toUpperCase();
}
}
}
return null;
}
//使用Optional
public static String optional2(Person person){
return Optional.ofNullable(person)
.map(Person::getStudent)
.map(Student::getName)
.map(String::toUpperCase).orElse(null);
}
实战:
package nccloud.api.testcase.base;
import java.util.Optional;
public class OptionalTest {
public static void main(String[] args) {
test1();
}
public static void test1() {
//isPresent 判断容器中对象是否为空
//ofNullable 可以接受任何对象(空或者非空)
Person person1 = new Person();
boolean present = Optional.ofNullable(person1).isPresent();// true:person1不为空 false:person1为空
System.out.println(present);//true
//of 只能接受非空的对象
// person1=null;
// Optional
// System.out.println("Optional
//get 返回optional容器中的数据
//需注意如果返回的是空Optional使用get()方法会出错!!!
person1.setStudents(new Student("zfq","23",1));
Person person = Optional.ofNullable(person1).get();
System.out.println(person.getStudents().toString());//Student{name='zfq', sex='23', age=1}
// 如果Optional容器中的对象不为空,执行函数接口中的方法
Student student=new Student("xyl", "nv", 1);
Optional.ofNullable(student).ifPresent(System.out::println);//Person person1 = new Person();
// orElse 如果对象不是空,返回Optional容器中的值,否则返回orElse中的值
// 需要注意方法返回类型需要和orElse函数表达式返回的类型一致!!!
String str = null;
String s = Optional.ofNullable(str).orElse("dont input empty string !");
System.out.println(s);// dont input empty string !
String str1 = "";
String s1 = Optional.ofNullable(str1).orElse("dont input empty string !");
System.out.println(s1);// 空
//orElseGet 如果容器中对象为空则返回函数表达式结果,跟orElse区别是可以执行一个函数
person1 = null;
Person res = Optional.ofNullable(person1).orElseGet(() -> {
Person ps = new Person();
ps.setStudents(new Student("xyl", "nv", 1));
return ps;
});
System.out.println(res.getStudents().getName());// xyl
// 如果容器中是空值,返回自定义异常
// person1 = null;
// Optional.ofNullable(person1).orElseThrow(() -> new RuntimeException("this is RuntimeException !"));
//filter 根据条件进行过滤,满足返回该对象,否则返回空Optional
//map 将Optional中的对象当做参数执行函数接口,如果参数是空返回空的Optional对象,如果不是执行结果并放在Optional容器中返回
Student stud=new Student("xyl", "nv", 1);
String orElse = Optional.ofNullable(stud).filter(st -> st.getName().contains("x")).map(Student::getName).map(String::toUpperCase).orElse("name is null");
System.out.println(orElse);//XYL
}
}