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

通过本文你可以用非常简短的代码替代业务逻辑中的判null校验,并且很容易的在出现空指针的时候进行打日志或其他操作。

注:如果对Java8新特性中的lambda表达式与Stream不熟悉的可以去补一下基础,了解概念。

首先下面代码中的List放入了很多Person对象,其中有的对象是null的,如果不加校验调用Person的getXXX()方法肯定会报空指针错误,一般我们采取的方案就是加上if判断:

public class DemoUtils {public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person());personList.add(null);personList.add(new Person("小明",10));personList.add(new Person("小红",12));for (Person person : personList) {//if判空逻辑if (person != null) {System.out.println(person.getName());System.out.println(person.getAge());}}}static class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
}

其实,Java新特性Stream API 与 Optional 提供了更加优雅的方法:

利用Stream API 中的 filter将队列中的空对象过滤掉,filter(Objects::nonNull)的意思是,list中的每个元素执行Objects的nonNull()方法,返回false的元素被过滤掉,保留返回true的元素。

 public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person());personList.add(null);personList.add(new Person("小明",10));personList.add(new Person("小红",12));personList.stream().filter(Objects::nonNull).forEach(person->{System.out.println(person.getName());System.out.println(person.getAge());});}

示例中的personList本身也可能会null,如果业务逻辑中要求personList为null时打日志报警,可以用Optional优雅的实现:

public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person());personList.add(null);personList.add(new Person("小明", 10));personList.add(new Person("小红", 12));Optional.ofNullable(personList).orElseGet(() -> {System.out.println("personList为null!");return new ArrayList<>();}).stream().filter(Objects::nonNull).forEach(person -> {System.out.println(person.getName());System.out.println(person.getAge());});
}

代码中的

orElseGet(() -> {//代替logSystem.out.println("personList为null!");return new ArrayList<>();
})

表示如果personList为null,则执行这2句代码,返回一个不含元素的List,这样当personList为null的时候不会报空指针错误,并且还打了日志。

转载于:https://www.cnblogs.com/keeya/p/11563786.html

Java使用Optional与Stream来取代if判空逻辑(JDK8以上)相关推荐

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

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

  2. 使用Java 8 Optional避免空指针异常

    2019独角兽企业重金招聘Python工程师标准>>> Optional可以让你的代码具有可读性,且会避免出现空指针异常. 都说没有遇到过空指针异常的程序员不是Java程序员,nul ...

  3. JAVA8新特性Optional和Stream和Localdate用法

    1.Optional类是Java8为了解决null值判断问题 2.Stream 是Java SE 8类库中新增的关键抽象,Java 8 引入的的Stream主要用于取代部分Collection的操作, ...

  4. Java 8 - Optional实战

    文章目录 Pre 用 Optional 封装可能为 null 的值 异常与 Optional 的对比 避免使用基本类型的Optional对象 Pre Java 8 - Optional全解相信你已经了 ...

  5. Java 8 - Optional全解

    文章目录 在Optional出现之前经常遇到的空指针异常 采用防御式减少NullPointerException (深度质疑) null-安全的第二种尝试(过多的退出语句) Optional的介绍以及 ...

  6. Java 8系列之Stream中万能的reduce

    Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...

  7. Java 8系列之Stream的强大工具Collector

    Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...

  8. java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  9. 在Java 8中使用Stream API列出ZIP文件的内容

    在Java 8 java.util.zip.ZipFile配备了stream方法,该方法可以非常轻松地浏览ZIP文件条目. 在此博客文章中,我将展示许多示例,这些示例显示了我们可以如何快速浏览ZIP文 ...

最新文章

  1. MySQL七种join
  2. logcat错误日志
  3. SAP 电商云 Spartacus Checkout 端到端测试
  4. python把英语句子成分字母_句子成分的表达字母
  5. python字符串连接操作-Python连接字符串过程详解
  6. lg手机历史机型_华为后,又一中国芯崛起!国际手机巨头LG都采用它的芯片了...
  7. Lovesource博士:或者我是如何学会不再担心和热爱开放的
  8. Maven 项目关于 plexus-utils:jar的错误解决
  9. python模拟火车订票系统_毕业论文:火车票网上订票系统
  10. 数据结构C语言般卷纸真题,数据结构(C语言版)考研真题(A卷)
  11. Java基础恶补系列
  12. 时空超分辨论文阅读笔记(一)---- Zooming Slow-Mo
  13. [动画特效] 炫彩界面库-动画特效来了,可实现各种网页特效v3.3.0
  14. 计算机学生的理想定位范文,我理想中的学校作文范文(通用3篇)
  15. 【强化学习论文精读】Timeliness Guaranteed Traffic Flow Forecasting Based on Federated Online Learning
  16. SMARTBI 电子表格——分片报表
  17. pycharm报Process finished with exit code -1073741515 (0xC0000135)
  18. Python: matplotlib模块 源码阅读理解
  19. 【Paper Note】基于决策树算法的电信运营商客户流失预测
  20. IDEA的菱形断点是什么意思

热门文章

  1. git 修改全局配置
  2. php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
  3. 美参议员敦促SEC就雅虎黑客案信息披露义务展开调查
  4. C++继承中析构函数 构造函数的调用顺序以及虚析构函数
  5. java Servlet Filter 拦截Ajax请求,统一处理session超时的问题
  6. 思考:用开发移动app的观念来开发网站
  7. 《团队开发一(求一个数组的连续的子数组之和的最大值)》
  8. Interface实现多态简例
  9. 多种分布式文件系统简介
  10. BSPreloadTableVew带有预加载功能的tableView