Java使用Optional与Stream来取代if判空逻辑(JDK8以上)
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以上)相关推荐
- java判空null前后,关于java:引不要再使用null判空了
以下文章来源于Hollis ,作者上帝爱吃苹果 对于Java程序员来说,null是令人头痛的货色.时常会受到空指针异样(NPE)的骚扰.连Java的发明者都抵赖这是他的一项微小失误. 那么,有什么方法 ...
- 使用Java 8 Optional避免空指针异常
2019独角兽企业重金招聘Python工程师标准>>> Optional可以让你的代码具有可读性,且会避免出现空指针异常. 都说没有遇到过空指针异常的程序员不是Java程序员,nul ...
- JAVA8新特性Optional和Stream和Localdate用法
1.Optional类是Java8为了解决null值判断问题 2.Stream 是Java SE 8类库中新增的关键抽象,Java 8 引入的的Stream主要用于取代部分Collection的操作, ...
- Java 8 - Optional实战
文章目录 Pre 用 Optional 封装可能为 null 的值 异常与 Optional 的对比 避免使用基本类型的Optional对象 Pre Java 8 - Optional全解相信你已经了 ...
- Java 8 - Optional全解
文章目录 在Optional出现之前经常遇到的空指针异常 采用防御式减少NullPointerException (深度质疑) null-安全的第二种尝试(过多的退出语句) Optional的介绍以及 ...
- Java 8系列之Stream中万能的reduce
Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...
- Java 8系列之Stream的强大工具Collector
Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...
- java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- 在Java 8中使用Stream API列出ZIP文件的内容
在Java 8 java.util.zip.ZipFile配备了stream方法,该方法可以非常轻松地浏览ZIP文件条目. 在此博客文章中,我将展示许多示例,这些示例显示了我们可以如何快速浏览ZIP文 ...
最新文章
- MySQL七种join
- logcat错误日志
- SAP 电商云 Spartacus Checkout 端到端测试
- python把英语句子成分字母_句子成分的表达字母
- python字符串连接操作-Python连接字符串过程详解
- lg手机历史机型_华为后,又一中国芯崛起!国际手机巨头LG都采用它的芯片了...
- Lovesource博士:或者我是如何学会不再担心和热爱开放的
- Maven 项目关于 plexus-utils:jar的错误解决
- python模拟火车订票系统_毕业论文:火车票网上订票系统
- 数据结构C语言般卷纸真题,数据结构(C语言版)考研真题(A卷)
- Java基础恶补系列
- 时空超分辨论文阅读笔记(一)---- Zooming Slow-Mo
- [动画特效] 炫彩界面库-动画特效来了,可实现各种网页特效v3.3.0
- 计算机学生的理想定位范文,我理想中的学校作文范文(通用3篇)
- 【强化学习论文精读】Timeliness Guaranteed Traffic Flow Forecasting Based on Federated Online Learning
- SMARTBI 电子表格——分片报表
- pycharm报Process finished with exit code -1073741515 (0xC0000135)
- Python: matplotlib模块 源码阅读理解
- 【Paper Note】基于决策树算法的电信运营商客户流失预测
- IDEA的菱形断点是什么意思