防止 NPE,是程序员的基本修养。


NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方。NPE常是导致Java应用程序失败的最常见的原因。在日常研发工作中,经常会处理各种变量、集合,但在使用的过程中,往往要进行空判断,不然会出现NPE。

JDK8新特性之Optional介绍

Optional类实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空指针异常。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。尽量避免在程序中直接调用Optional对象的get()和isPresent()方法,避免使用Optional类型声明实体类的属性。

  • Optional.of(T t) : 创建一个 Optional 实例
  • Optional.empty() : 创建一个空的 Optional 实例
  • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
  • isPresent() : 判断是否包含值 
  • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
  • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
  • flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

1.创建optional对象,一般用ofNullable()而不用of()

  • empty() :用于创建一个没有值的Optional对象:Optional<String> emptyOpt = Optional.empty();
  • of() :使用一个非空的值创建Optional对象:Optional<String> notNullOpt = Optional.of(str);
  • ofNullable() :接收一个可以为null的值:Optional<String> nullableOpt = Optional.ofNullable(str);

2.判断Null:
isPresent():如果创建的对象实例为非空值的话,isPresent()返回true,调用get()方法会返回该对象,如果没有值,调用isPresent()方法会返回false,调用get()方法抛出NullPointerException异常。
3.获取对象:
get()
4.使用map提取对象的值

如果我们要获取User对象中的roleId属性值,常见的方式是先判断是否为null然后直接获取,但使用Optional中提供的map()方法可以以更简单的方式实现
5.使用orElse方法设置默认值,Optional类还包含其他方法用于获取值,这些方法分别为:

  • orElse():如果有值就返回,否则返回一个给定的值作为默认值;
  • orElseGet():与orElse()方法作用类似,区别在于生成默认值的方式不同。该方法接受一个Supplier<? extends T>函数式接口参数,用于生成默认值;
  • orElseThrow():与前面介绍的get()方法类似,当值为null时调用这两个方法都会抛出NullPointerException异常,区别在于该方法可以指定抛出的异常类型。

6.使用filter()方法过滤

filter()方法可用于判断Optional对象是否满足给定条件,一般用于条件过滤,在代码中,如果filter()方法中的Lambda表达式成立,filter()方法会返回当前Optional对象值,否则,返回一个值为空的Optional对象。

Optional判空

Optional判空写法

Optional.ofNullable(变量).orElse(默认数值);

例如:求字符串user的长度(为空的时候返回0)

常规实现方式:

// 从前台界面获取输入的用户信息
String user = getUserFromUI();
if (user == null){return 0;
} else {return user.length();
}

使用JDK8中的Optional实现方式:

// 从前台界面获取输入的用户信息
String user = getUserFromUI();
return Optional.ofNullable(user).orElse("").length;

Optional循环遍历集合

例如:循环遍历集合

常规实现方式:

List<String> userList = getList();
if (list != null) {for(String user: list){System.out.println(user);}
}

使用JDK8中的Optional实现方式:

List<String> userList = getList();
Optional.ofNullable(userList).orElse(new ArrayList<>()).forEach(user -> {System.out.println(user);
});

JDK8:使用Optional进行变量判空、集合遍历相关推荐

  1. 求求你,不要再使用!=null判空了!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 本文来自作者投稿,原作者:上帝爱吃苹果 对于Java程序员 ...

  2. java判空null前后,关于java:引不要再使用null判空了

    以下文章来源于Hollis ,作者上帝爱吃苹果 对于Java程序员来说,null是令人头痛的货色.时常会受到空指针异样(NPE)的骚扰.连Java的发明者都抵赖这是他的一项微小失误. 那么,有什么方法 ...

  3. Java 优雅判空的方法

    为了避免 NullPointerException 出现,我们经常会进行如下操作. if (object != null) {object.do(); } 那么每次使用一个不确定的对象,都需要进行一次 ...

  4. 求求你不要在用!=null判空了

    作者:诗意凌风 | http://suo.im/5t3akh 导语 在没有用Optional判空之前,你是否也像下面的代码一样判空呢?如果是,请往下看,Optional 相对传统判空的优势. java ...

  5. Java使用Optional与Stream来取代if判空逻辑(JDK8以上)

    Java使用Optional与Stream来取代if判空逻辑(JDK8以上) 通过本文你可以用非常简短的代码替代业务逻辑中的判null校验,并且很容易的在出现空指针的时候进行打日志或其他操作. 注:如 ...

  6. Optional联合Stream使用——集合判空或取值

    jdk8Optional联合Stream使用简单判空取值 原来判断 SspUnionPolicyDetailShowResp showResp = new SspUnionPolicyDetailSh ...

  7. 【Java 8系列】Java开发者的判空利器 -- Optional

    热门系列: [Java 8系列]收集器Collector与工具类Collectors [Java 8系列]Stream详解,看这一篇就够啦 [Java 8系列]Lambda 表达式,一看就废 [Jav ...

  8. JDK8 新特性:判空遍历写法

    在工作中,经常会处理各种变量,但往往会在使用变量的时候,要进行空判断,不然要报错. Java 8 提供了判空写法: Optional.ofNullable(变量).orElse(默认值): 例1:求字 ...

  9. java中集合判空_Java中的类型安全的空集合

    java中集合判空 我以前曾在Java Collections类的实用程序上进行过博客撰写,并且特别地在使用Usings Collections Methods上的博客emptyList(),empt ...

最新文章

  1. 做好自己该做的,赢取自己这一份努力
  2. 姚文详(Joseph Yiu):《ARM Cortex-M0权威指南》中文版目录
  3. 《计算机组成原理》第05章在线测试
  4. Burst trie(爆炸式字典树)解读
  5. Hive更改表名FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Una ble
  6. 数据分析——朴素贝叶斯原理示意图
  7. 警告warningC4018有符号/无符号不匹配
  8. matlab没有pso工具箱,MATLAB-PSO工具箱
  9. Monocular slam 的理论基础(1)
  10. 网易严选退出双十一:“抵制”鼓吹过度消费
  11. linux音频设备节点,Linux音频驱动之三:PCM设备的创建
  12. cad数字签名制作制作_电影制作部门按数字变化
  13. Android系统启动流程分析
  14. FatFs 之三 FAT文件系统基础、FAT 数据格式、引导、编码
  15. 冰刃IceSword中文版 V1.22 绿色汉化修正版
  16. 从希腊神话到好莱坞大片,人工智能的七大历史时期值得铭记
  17. centOS系统下openGauss极简版安装
  18. 618运动好物清单来了、这几款运动产品好玩又实用
  19. harbor 下载地址(国内代理)
  20. 英文连写字体怎么练_衡水英文字体视频教程

热门文章

  1. Python网络爬虫笔记:下载、分析京东P20销售数据
  2. centos 删除crontab_centos crontab(定时任务) 使用
  3. matlab中文文档_Linux下Matlab安装
  4. 简单分析Flask 数据库迁移详情
  5. Python中的super()用法
  6. 图论-无向图的连通性(POJ1144)(POJ3352)
  7. Just another Robbery LightOJ - 1079[背包形状的概率dp]
  8. vue判断离开当前页面_js监听用户进入和离开当前页面
  9. oracle多个instance,Oracle 数据库EM访问多个Instance
  10. 牛客挑战赛36 D. 排名估算( “概率论全家桶”,好题,拉格朗日插值求自然数 k 次幂之和)