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(() -> { //代替log System.out.println("personList为null!"); return new ArrayList<>(); })
表示如果personList为null,则执行这2句代码,返回一个不含元素的List,这样当personList为null的时候不会报空指针错误,并且还打了日志。
相关文章
Java8 实现stream将对象集合list中抽取属性集合转化为map或list
这篇文章主要介绍了Java8 实现stream将对象集合list中抽取属性集合转化为map或list的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05- 这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
解决:failed to open stream: No such file or directory in
本教程来给各位同学介绍failed to open stream: No such file or directory in解决办法,有需要了解的朋友可进入参考。 Warning: include_once(./include/main.i...2016-11-25校验非空的注解@NotNull如何取得自定义的message
这篇文章主要介绍了校验非空的注解@NotNull如何取得自定义的message,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-29- 这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
- 最近在工作中遇到了一个问题,通过查找相关资料才得知原因是因为返回结果的问题,下面这篇文章主要给大家介绍了关于lua读取redis数据的null判断的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2020-06-30
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20- 这篇文章主要介绍了c#之FileStream对象读写大文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了mysql IS NULL使用索引案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-14
- 这篇文章主要分享了个人使用C# FileStream实现的读写的文本操作的小程序,主要是复习下对filestream的理解,希望对大家学习C#能够有所帮助...2020-06-25
- 测试代码如下:复制代码 代码如下:<?php$fp=fopen("http://www.sina.com.cn", 'r');$stream_meta = stream_get_meta_data($fp);print_r($stream_meta);?>在我本机输出如下:Array( [wrapper_data] => Array...2013-10-04
- 这篇文章主要介绍了Java8之Stream流代替For循环操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-19
- 这篇文章主要介绍了C#中FileStream的对比以及使用方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
- Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。...2016-09-01
解决SpringBoot返回结果如果为null或空值不显示处理问题
这篇文章主要介绍了解决SpringBoot返回结果如果为null或空值不显示处理问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-28- 本文主要对比C# 6 null运算符与老版本的不同,并且用代码实例测试,发现新语法性能提高,语法简化了。希望看到的同学对你有所帮助...2020-06-25
- 这篇文章主要介绍了浅谈为什么Mysql数据库尽量避免NULL,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-08
- Stream 和 byte[] 之间的转换...2020-06-25
C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换
本文主要介绍字符串string和内存流MemoryStream及比特数组byte[]之间相互转换的方法,需要的小伙伴可以参考一下。...2020-06-25- stream_context_create创建并返回一个文本数据流并应用各种选项,可用于fopen(),file_get_contents()等过程的超时设置、代理服务器、请求方式、头信息设置的特殊过程。...2016-11-25