Optional类是java8新增的类,主要是用来解决空指针异常(NullPointerException)。Optional类在函数式编程规范中具有重要意义。Optional方法可以避免频繁的判空操作。
例如:
public void function(User u){
if(u!=null){
Adder adder = u.getAdder();
if(adder!=null){
Area area = adder.getArea();
if(area!=null){
String name = area.getName();
if(name!=null){
System.out.println(name.toUpperCase());
}
}
}
}
}
如果不这样一层层的判空,直接执行,则很有可能抛出空指针异常:
System.out.println(u.getAdder().getArea.getName().toUpperCase());
如果我们使用了Optional类,则很方便的排除了频繁的判空操作:
Optional op = Optional.ofNullable(u);
String name = op.map(User::getAdder)
.map(Adder::getArea)
.map(Area::getName)
.map(String::toUpperCase)
.orElse("");
System.out.println(name);
注意:
User user = new User("zhangsan",23);
Optional<User> op = Optional.of(user);
op.ifPresent(u->{
//执行打印
System.out.println(u.getName());
});
User user = null;
Optional<User> op = Optional.ofNullable(user);
op.ifPresent(u->{
//不执行
System.out.println(u.getName());
});
Optional<User> op = Optional.empty();
op.ifPresent(u->{
//不执行
System.out.println(u.getName());
});
User user1 = null;
User user2 = new User("lisi",24);
Optional<User> op = Optional.ofNullable(user1);
//如果op对象值为空则返回user2,否则返回原值
User user = op.orElse(user2);
System.out.println(user);
User user1 = null;
Optional<User> op = Optional.ofNullable(user1);
//op有值则直接返回值,否则执行函数生成返回
User user = op.orElseGet(()-> new User("lisi",25));
System.out.println(user);
注意:如果代码
User user = op.orElse(createObj());
User user = op.orElseGet(createObj());
public User createObj(){
return new User();
}
当op为empty时,都会执行createObj()方法。当op不为empty时,orElse还是会执行createObj()方法,造成内存开销。而orElseGet()则不会执行createObj()方法。
User lisi = op.orElseThrow(() -> new NullPointerException());
System.out.println(lisi);
User user = new User("zhangsan",23);
Optional<User> op = Optional.of(user);
op.ifPresent(u->{
//执行打印
System.out.println(u.getName());
});
不要像以前那样的方式来使用:
if (op.isPresent()) {
System.out.println(op.get());
}
Optional<User> op = Optional.empty();
boolean flag = op.isPresent()
//打印false
System.out.println(flag);
原始写法
//原始写法,不得不一层一层的执行判空操作
public void function(User user){
if(user!=null){
String name = user.getName();
if(name!=null){
System.out.println(name.toUpperCase());
}else{
System.out.println("不存在");
}
}else{
System.out.println("不存在");
}
}
Optional.map() 方法
//使用了map方法,级联的调用,精简代码
public void function(User user){
String name = op.map(u -> u.getName())
.map(n -> n.toUpperCase())
.orElse("不存在");
System.out.println(name);
}
public class User {
private String name;
private Integer age;
private Integer sex;
public Optional<Integer> getSex(){
return Optional.ofNullable(sex);
}
}
//flatMap的参数返回值必须为Optional类型
Integer sex = op.flatMap(User::getSex).orElse(-1);
System.out.println(sex);
Optional<User> op = Optional.of(new User("李四",20));
//使用filter过滤是否是张三,再用map映射返回
String s = op.filter(u -> u.getName().equals("张三"))
.map(User::getName)
.orElse("不存在");
//打印不存在
System.out.println(s);