在Java8中新增了一个Optional类,官方描述是该类是一个容器对象,其中可能包含一个空或非空的值。如果存在一个值,isPresent()将返回true,get()将返回该值。

错误使用姿势

简单的根据描述,我们认为Optional可以帮我们解决NPE问题,假设任务需求为获取用户的性别,那么可以这样写:

Optional<User> user = ...
if(user.isPresent()) {return user.get().getSex();
} else {return null;
}

其实这样并没有改变原本的思维, 只是本能的认为该类是 User 实例的包装, 这与下面的写法没有本质的区别:

User user = ...
if(user != null) {return user.getSex();
} else {return null;
}

正确使用姿势

想要正确的使用,得知道有哪些方法,下面我列出一些常用的API:

Modifier and Type Method Description
static < T > Optional< T > empty() 返回一个空的Otptional实例
static < T > Optional< T > of(T value) 传入的值必须非null,否则抛出NPE
static < T > Optional< T > ofNullable(T value) 当传入null时,返回空的Optional实例
< U > Optional< U > map(Function mapper) 如果值存在,则将所提供的映射函数应用于该函数,否则返回一个描述结果的可选项
T orElse(T other) 如果值存在返回该值,否则返回传入的值
T orElseGet(Supplier other) 如果值存在返回该值,否则调用其他值并返回该调用的结果
void ifPresent(Consumer consumer) 当值存在时执行参数上的语句
Optional< T > filter(Predicate predicate) 当值存在且符合指定规则返回该值,否则返回null
< X extends Throwable> T orElseThrow(Supplier exceptionSupplier) 如果值存在返回该值,否则抛出指定异常

前三个为构造方法,一般使用ofNullable即可,因为它能智能的判断参数是否为null,但是该方法也不是一劳永逸的,否则也没必要外露另外两个构造方法,如果我们明确的知道参数为非null或不允许任何null值的存在,可以使用of

对于其他方法,给出例子相信能很快理解:

/* ===== 得到User实例 ==== */// 等价于 return user.isPresent() ? user.get() : null;
return user.orElse(null); // 等价于 return user.isPresent() ? user: getNewUser();
return user.orElseGet(() -> getNewUser());/*等价于 if (user.isPresent()) { System.out.println(user.get()); }*/
user.ifPresent(System.out::println);
/* ===== 得到User.sex ==== *//*等价于:if(user.isPresent()) {return user.get().getSex();} else {return "男";}
*/
return user.map(u -> u.getSex()).orElse("男");

总结:使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法, 应使用像 Optional.orElse()Optional.orElseGet()Optional.map() 等这样的方法。

Java8 Optional详解相关推荐

  1. 【java8新特性】——Optional详解(三)

    一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null ...

  2. Optional 详解 Java

    Optional的使用详解 1.Optional介绍 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Opt ...

  3. java optional详解_java8中Optional的用法详解

    package com.lyzx.concurrent.java8; import org.junit.Test; import java.util.Optional; import java.uti ...

  4. Java8 ConcurrentHashMap详解

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本 ...

  5. Java8 HashMap详解

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 ###Java8 HashMap Java8 对 HashMap 进行了一些修改,最大的不同就 ...

  6. Java8 Stream详解~收集(collect)

    collect,收集,可以说是内容最繁多.功能最丰富的部分了.从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合. 1 归集(toList/toSet/toMap) ...

  7. Java8 Stream详解~归约(reduce)

    归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和.求乘积和求最值操作. 「案例一:求Integer集合的元素之和.乘积和最大值.」 public class StreamTest { ...

  8. Java8 Stream详解~聚合(max/min/count)

    max.min.count这些字眼你一定不陌生,没错,在mysql中我们常用它们进行数据统计.Java stream中也引入了这些概念和用法,极大地方便了我们对集合.数组的数据统计工作. 「案例一:获 ...

  9. Java8 Stream详解~遍历/匹配(foreach/find/match)

    Stream也是支持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的.Stream的遍历.匹配非常简单. // import已省略,请自行添加,后面代码亦是publi ...

  10. Java8 Stream详解~Stream 创建

    Stream可以通过集合数组创建. 1.通过 java.util.Collection.stream() 方法用集合创建流 List<String> list = Arrays.asLis ...

最新文章

  1. TeaTalk 线上直播倒计时 | 云数据库技术创新研究与实践
  2. 名校 Stanford
  3. 鸿蒙 github harmony,鸿蒙HarmonyOS之AbilitySlice间导航
  4. crontab -e 运行python的脚本的坑
  5. reverseajax(comet) socket 杂记
  6. ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded
  7. 第十二届蓝桥杯C++赛后感
  8. 《软件测试技术实战:设计、工具及管理》—第2章 2.7节测试用例不应该包含实际的数据...
  9. 掘金mysql_MySQL学习笔记(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
  10. 数据结构课程设计- (二) 栈与队列(迷宫问题)
  11. EMC之 “不整改好别回来了”
  12. RIP、OSPF、ISIS协议的区别
  13. GNU C Complier - GNU Compiler Collection - GCC
  14. 3.4.3 区域与图像的平均灰度值
  15. 云直播丁云鹏:最可怕的,是你低估生活的残酷
  16. MS-DOC 文件格式概述
  17. 最新江苏水利水电安全员模拟真题及答案解析
  18. matlab 工具箱 径向基,精确径向基(matlab工具箱)
  19. C++ string assign和append的常用方法
  20. 读《小强升职记》总结

热门文章

  1. 阿里巴巴Android开发手册V1.0.0随手笔记
  2. java循环练习:输出1+2+3....+100的和
  3. linux下定时执行sh
  4. VS2010下配置 OpenCV2.2
  5. 51CTO网友感谢信:昨天以940分的成绩顺利通过NE考试 在此特地感谢网工泡泡
  6. 090717 T OOD时的接口
  7. Linux数据报文的来龙去脉
  8. 编码顺序、frame_num和POC
  9. 用户空间缺页异常pte_handle_fault()分析--(上)
  10. 数据库程序设计复习资料