Optional用法与争议点

打印 上一主题 下一主题

主题 875|帖子 875|积分 2625

原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。
简介

要说Java中什么异常最容易出现,我想NullPointerException一定当仁不让,为了解决这种null值判断问题,Java8中提供了一个新的工具类Optional,用于提示程序员注意null值,并在特定场景中简化代码逻辑。
比如下面一段取深层属性值的代码:
  1. Order order = getOrderById(orderId);
  2. String userCode = "";
  3. if(order != null){
  4.     if(order.getUser() != null){
  5.         if(order.getUser().getUserCode() != null){
  6.             userCode = order.getUser().getUserCode().toUpperCase();
  7.         }
  8.     }
  9. }
复制代码
这种场景还比较常见,但深层嵌套的if判断,让代码阅读者压力倍增。
看看用Optional后的写法,如下:
  1. Order order = getOrderById(orderId);
  2. String userCode = Optional.ofNullable(order)
  3.     .map(Order::getUser)
  4.     .map(User::getUserCode)
  5.     .map(String::toUpperCase)
  6.     .orElse("")
复制代码
链式调用的写法,让代码可读性增强了不少,不用判断null,是因为Optional在内部已经做了null值判断了!那我们来看看Optional都有哪些用法吧。
创建Optional

ofNullable()方法
创建一个Optional,传入的值可以是null或不是null。
of()方法
得到一个Optional,明确知道传入的值不是null时用这个,如果传null会报错NullPointerExcepiton。
其实值不为null一般是没必要使用Optional的,这个应该是用于特殊场景,比如方法返回值必须是一个Optional。
empty()方法
得到一个空的Optional,一般也用于返回值必须是Optional的场景。
判空

ifPresent()方法
判断是否有值,注意,这个方法虽然看起来挺好用的,但它不太应该是使用Optional时第一个使用的方法,如下:
  1. if(opt.ifPresent()){
  2.     ...
  3. if(obj != null) {
  4.     ...
  5. }
复制代码
这两个代码除了写法不一样,对于代码可读性方面没有根本区别!
取值

get()方法
获取Optional的值,当没有值时会抛出一个NoSuchElementException异常。

同样的,它也不太应该是使用Optional时的第一个使用的方法,因为抛NoSuchElementException与抛NullPointerException并没有太大区别。
orElse方法
没有值时会返回指定的值。
  1. String name = nameOpt.orElse("");
复制代码
orElseGet方法
同上,不过参数变成了一个提供默认值的lambda函数,这用在取指定值需要一定代价的场景,如下:
  1. BigDecimal amount = amountOpt.orElseGet(() -> calcDefaultAmount());
复制代码
orElseThrow方法
没有值时抛出一个指定的异常,如下:
  1. Optional<User> userOpt = getUser(userId);
  2. User user = userOpt.orElseThrow(() -> new NullPointerException("userId:" + userId));
复制代码
可能会有人疑问,你还是抛出了一个NPE异常,和不使用Optional有啥区别?区别是这个NPE异常会告诉你哪个userId查不到数据,方便定位问题,而jvm抛出的NPE是没有这个信息的。
函数式处理


<strong>ifPresent(Consumer

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表