从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。
@Test
void optionalTest() {
Lambda lambda = new Lambda();
lambda = null;
//调用
Integer age = age(lambda);
Integer integer = age1(lambda);
System.out.println(integer+"optional");
System.out.println(age);
}
//原始写法
public Integer age(Lambda lambda){
//Person 没有实例化 是null 会报空指针异常
//判断空指针
if (lambda != null) {
//判断空指针
if (lambda.getPerson() != null) {
Integer age = lambda.getPerson().getAge();
return age;
}
}
return null;
}
//使用Optional
public Integer age1(Lambda lambda) {
//ofNullable()该方法创建Optional 对象,如果lambda 是 null 输出的是 null,不会抛出异常
Optional<Lambda> lambda1 = Optional.ofNullable(lambda);
//.orElse(),如果传入的Lambda 是空,就会用参数里面新new 的,new Lambda(new Person(2)
// 如果不是空,就会用传入的
//所以lambda2,一定非空
Lambda lambda2 = lambda1.orElse(new Lambda(new Person(2)));
Person person = lambda2.getPerson();
//
Optional<Person> person1 = Optional.ofNullable(person);
//所以person2,一定非空
Person person2 = person1.orElse(new Person(18));
Integer age = person2.getAge();
return age;
}
案例1
public static void main(String[] args) {
String str = "hello";
String str1 = null;
//把str放入Optional容器中
//ofNullable可以放入空值
Optional<String> str2 = Optional.ofNullable(str1);
//判断是不是空
if (str2.isPresent()) {
String s1 = str2.get();
System.out.println(s1);
} else {
System.out.println("空");
}
// orElse 如果存在就返回值,如果不存在就设置一个默认值
String s2 = str2.orElse(str);
System.out.println(s2);
//orElseGet 参数是重写 get 方法如果存在就返回值,如果不存在就设置一个默认值
String s3 = str2.orElseGet(() -> {
return "hahah";
});
System.out.println(s3);
}