分类: Java
2022-09-29 11:22:40
NullPointerException在开发过程中经常遇到,稍有不慎小BUG就出现了,如果避免这个问题呢,Optional就是专门解决这个问题的类,那么Optional如何使用呢?让我们一起探索一下吧!
Optional类是Java8为了解决null值判断问题而创建的容器类,在java.util 下,使用Optional类可以避免显式的null值判断,避免null导致的NullPointerException。首先,Optional是一个容器,它可以保存类型T的值,也可以为null的容器对象。Optional容器只能存一个值。
1)源码:
/**
* Common instance for {@code empty()}.
*/ private static final Optionalsuper T> predicate) {
Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty();
}
2)方法说明
filter(Predicate p): 如果optional不为空,则执行Predicate p,如果p的结果为true,则返回原本的optional,否则返回空的optional
3)测试代码
public static void main(String[] args) {
Integer value1 = 5;
Integer value2 = 6;
Optional optional1 = Optional.ofNullable(value1);
Optional optional2 = Optional.of(value2);
Optional result =optional1.filter(t->t > 5);
System.out.println("optional1的filter后的值:"+result);
result =optional2.filter(t->t > 5);
System.out.println("optional2的filter后的值:"+result);
4)运行结果
1)源码
public Optional map(Functionsuper T, ? extends U> mapper) {
Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value));
}
} public Optional flatMap(Functionsuper T, Optional> mapper) {
Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value));
}
}
2)方法说明
3)测试代码
public static void main(String[] args) {
User user1 = null;
User user2 = new User("user2名字",19);
Optional optional1 = Optional.ofNullable(user1);
Optional optional2 = Optional.of(user2);
System.out.println("=========map==========");
System.out.println("optional1的map前的值:"+optional1);
Optional result =optional1.map(t->t.getName());
System.out.println("optional1的map后的值:"+result);
System.out.println("optional2的map前的值:"+optional2);
result =optional2.map(t->t.getName());
System.out.println("optional2的map后的值:"+result);
System.out.println("===========flatMap========");
System.out.println("optional1的flatMap前的值:"+optional1);
Optional result2 =optional1.flatMap(t->Optional.ofNullable(t.getAge()));
System.out.println("optional1的flatMap后的值:"+result2);
System.out.println("optional2的flatMap前的值:"+optional2);
result2 =optional2.flatMap(t->Optional.ofNullable(t.getAge()));
System.out.println("optional2的flatMap后的值:"+result2);
} public class User {
String name;
Integer age; public User(String name,Integer age){ this.name = name; this.age=age;
} public String getName() { return name;
} public Integer getAge() { return age;
4)运行结果
A类有属性B类,B类有属性C类,C类有name这个字段。
使用Optional之前:
if(atest!=null){ Btest btest =atest.getBtest(); if(btest!=null){ Ctest ctest = btest.getCtest(); if (ctest != null) { name =ctest.getName(); } } }
使用Optional之后:
name = Optional.ofNullable(atest).map(t->t.getBtest()).map(t->t.getCtest()).map(t->t.getName()).orElse("默认值");
代码是不是看上去更整洁了呢?
通过对Optional源码解析和用例测试代码的运行结果,可以看出使用Optional可以优化null值判断代码,让代码变得更加优雅和整洁。
作者:陈昌浩