java 8 代替 null 的类 Optional

来源:互联网 发布:python遗传算法 编辑:程序博客网 时间:2024/06/16 12:06

这个返回值类型,其中有个是 Optional 类。

这个类是从Java 8 开始,才有的。他就是为了防止出现空值,也就是null。


Optional. 可以优雅的解决 NullPointException 的问题,

以前这样写:
User user = …..
if (user != null) {
return user.getOrders();
} else {
return Collections.emptyList();
}

新类可以写成:
Optional<User> user = ……
if (user.isPresent()) {
return user.getOrders();
} else {
return Collections.emptyList();
}

而上面的写法是不推荐使用的。

构造器:
Optional.of(obj)
    要求传入的 obj 不能是 null 值,否则就报 NullPointerException 异常了。
Optional.ofNullable(obj)
    对参数宽容,null 否都可
    null 就得到 Optional.empty()
    非 null 就是 Optional.of(obj)
Optional.empty()

新的写法:
return user.map(u -> u.getOrders()).orElse(Collections.emptyList())
 
//上面避免了我们类似 Java 8 之前的做法
if(user.isPresent()) {
  return user.get().getOrders();
} else {
  return Collections.emptyList();
}

存在即返回,没有则由方法产生:
return user.orElseGet(() -> fetchAUserFromDatabase()); //而不要 return user.isPresent() ? user: fetchAUserFromDatabase();

map  是可能无限级联的, 比如再深一层, 获得用户名的大写形式
return user.map(u -> u.getUsername())
           .map(name -> name.toUpperCase())
           .orElse(null);

这要搁在以前, 每一级调用的展开都需要放一个 null 值的判断
User user = .....
if(user != null) {
  String name = user.getUsername();
  if(name != null) {
    return name.toUpperCase();
  } else {
    return null;
  }
} else {
  return null;
}

Optional 是不是语法糖?
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

是的,Lambda表达式的本质只是一个"语法糖"

相关:
http://www.importnew.com/22060.html