Java Optional容器判空处理

  • 1. Java判空概述
  • 2. Java判空方式
    • 2.1 普通判空方式
    • 2.2 Optional判空方式

1. Java判空概述

Java判空方式有很多多,可以if是否为null或者采用Objects.isNull或者Objects.nonNull,或者其他工具类等都可以,本身写法也没什么问题,代码可读性也高,可能有时候不够简洁,所以Java8推出的Optional方式实现同样的功能,更加简洁,但是可读性降低了,这个根据需要权衡使用吧。对于Optional容器本身也会抛出空指针,他是直接抛出,用于快速定位,尽量避免空指针。

2. Java判空方式

2.1 普通判空方式

Objects.isNull();
Objects.nonNull();
Object == null;
... ...

2.2 Optional判空方式

1.Optional数组测试方式


/*** 一、Optional 容器类:用于尽量避免空指针异常* Optional.of(T t) : 创建一个 Optional 实例* Optional.empty() : 创建一个空的 Optional 实例* Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则直接抛出异常* <p>* isPresent() : 判断是否包含值* orElse(T t) :  如果调用对象包含值,返回该值,否则返回t* orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值* map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()* flatMap(Function mapper):与 map 类似,要求返回值必须是Optional*/
public class TestOptional {@Testpublic void test7() {List<Integer> list = new ArrayList<Integer>() {{add( 1 );add( 2 );add( 3 );}};List<Object> objectList = null;// 如果list为null就获取orElse中的内容,可以有效避免空指针Optional.ofNullable( list ).orElse( new ArrayList<>() ).forEach( System.out::println );Optional.ofNullable( objectList ).orElse( new ArrayList<>() ).forEach( System.out::println );//下边就会抛出空指针objectList.forEach( System.out::println );//如果为null就会抛出指定异常,可以自定义异常Optional.ofNullable( objectList ).orElseThrow( NullPointerException::new );Optional.ofNullable( objectList ).orElseThrow( RuntimeException::new );}@Testpublic void test4() {Optional<Employee> op = Optional.of( new Employee( 101, "张三", 18, 9999.99 ) );//为null的时候也会空指针//Optional<Employee> op = Optional.of( null );Optional<String> op2 = op.map( Employee::getName );System.out.println( op2.get() );Optional<String> op3 = op.flatMap( (e) -> Optional.of( e.getName() ) );System.out.println( op3.get() );}@Testpublic void test3() {Optional<Employee> op = Optional.ofNullable( new Employee() );//有值就获取,否则不执行if (op.isPresent()) {System.out.println( op.get() );}//如果op有值就获取值,没有值就去orElse中的值Employee emp = op.orElse( new Employee( "张三" ) );System.out.println( emp );//如果op有值就获取值,没有值就去orElse中的值Employee emp2 = op.orElseGet( () -> new Employee() );System.out.println( emp2 );}@Testpublic void test2() {// 不允许为空,直接抛出空指针Optional<Employee> op1 = Optional.ofNullable( null );System.out.println( op1.get() );//允许为空,但是get的时候回抛出空指针Optional<Employee> op = Optional.empty();System.out.println( op.get() );}/*** Optional.ofNullable( null )也会抛出空指针* 它所表达的思想是这里会直接抛出空指针快速定位*/@Testpublic void test1() {Optional<Employee> op = Optional.of( new Employee() );Employee emp = op.get();System.out.println( emp );}@Testpublic void test5() {Man man = new Man();String name = getGodnessName( man );System.out.println( name );}/*** 需求:获取一个男人心中女神的名字*/public String getGodnessName(Man man) {if (man != null) {Godness g = man.getGod();if (g != null) {return g.getName();}}return "苍老师";}/*** 运用 Optional 的实体类*/@Testpublic void test6() {Optional<Godness> godness = Optional.ofNullable( new Godness( "林志玲" ) );Optional<NewMan> op = Optional.ofNullable( new NewMan( godness ) );String name = getGodnessName2( op );System.out.println( name );}public String getGodnessName2(Optional<NewMan> man) {return man.orElse( new NewMan() ).getGodness().orElse( new Godness( "苍老师" ) ).getName();}
}

2.Optional对象测试方式
TestOptional


/*** Optional避免空指针,采用默认值或者自定义抛出异常* 使用场景:多层对象嵌套取值* * **/
public class OptionalTest {@Testpublic void Test1() {// 正常情况,都不为null,都可以正常执行User user = User.builder().address( Address.builder().country( Country.builder().countryName( "nj" ).build() ).build() ).build();// user为nulluser = null;// Address 为nulluser = User.builder().address( null ).build();// country 为nulluser = User.builder().address( Address.builder().country( null ).build() ).build();OptTest( user );}public void OptTest(User user) {// 第一种方式:存在空指针的风险,只要与一个对象为空就会空指针String countryName = user.getAddress().getCountry().getCountryName();System.out.println( "第一种方式:" + countryName );// 第二种方式:各种if判断避免了空指针,但是if层级太深,代码冗长if (user != null) {Address address = user.getAddress();if (address != null) {Country country = address.getCountry();if (country != null) {String couName = country.getCountryName();System.out.println( "第二种方式:" + couName );}}}// 第三种方式:代码简洁,避免空指针,武林那一步为空都会返回默认值String counName = Optional.ofNullable( user ).map( User::getAddress ).map( Address::getCountry ).map( Country::getCountryName ).orElse( "china" );System.out.println( "第三种方式:" + counName );// 第三种方式:代码简洁,避免空指针,武林那一步为空都会返回自定义异常String countryNameEx = Optional.ofNullable( user ).map( User::getAddress ).map( Address::getCountry ).map( Country::getCountryName ).orElseThrow( () -> new RuntimeException( "countryId is null" ) );System.out.println( "第四种方式:" + countryNameEx );}}

user


/*** @author zrj* @version V1.0* @since 2020/11/20**/
@Data
@Builder
public class User {private Integer userId;private String userName;private Address address;
}@Data
@Builder
public class Address {private Integer addressId;private String addressName;private Country country;
}@Data
@Builder
public class Country {private Integer countryId;private String countryName;
}

Java Optional容器判空处理相关推荐

  1. Java中List判空问题白话详解

    文章目录 Java中List判空问题 前言 对"空"的理解 结合程序 运行结果 总结 Java中List判空问题 记录下关于java编程过程中,对于获取数据放入list集合之后的判 ...

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

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

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

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

  4. 【java】数组判空工具类

    数组判空工具类 package com.dost.base.utils.extend;import java.util.List;/*** 数组工具*/ public abstract class A ...

  5. Java:List判空的条件:List=null 和 List.size = 0 当需要对一个LIst进行判空操作时我们可使用如下两个语句:

    当需要对一个LIst进行判空操作时我们可使用如下两个语句: if (list == null || list.size() == 0) {} if (list != null && l ...

  6. Java 中的判空操作

    equals与==的区别 一.String 的 isEmpty() 与 null 与 "" 区别 public class demo {public static void mai ...

  7. java double类型判空,简单封装JAVA空判断

    在项目开发过程中,面对各种各样的对象,如果稍不注意,就会发生NULL空指针报错;是不是很烦恼,特别是对重要的参数判读; 经过总结,把各种类型的空判断进行了简单的封装,对新手还是很方便的; packag ...

  8. java基础类型判空_java基础类型判空

    Swift教程_零基础学习Swift完整实例(九)_总结 五.总结 加上写博文的时间,用了前前后后一周左右的时间,每晚2小时左右,完成了这个改造,由于我是第一次碰swift,有些东西还用不顺手,用时比 ...

  9. JDK1.8新特性 Optional判空详解,简化判空操作

    一.简介 从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java ...

最新文章

  1. 使用深度学习和树搜索进行从零开始的既快又慢的学习
  2. C# 中Excel导出,可以自由设置导出的excel格式
  3. forEach 与 map 的区别
  4. 更换ip地址_手机怎么改ip地址
  5. C#获取引用组件的版本信息
  6. apache camel_发掘Apache Camel的力量
  7. html文件打开系统错误,win7打开word提示“无法打开文件Normal因为内容有错误”的两种解决方法...
  8. dwc_otg驱动 BUG: sleeping function called from invalid context at mm/page_alloc.c
  9. 框架设计之菜鸟漫漫江湖路系列 开篇
  10. singer页左侧滚动的时候右侧跟随高亮显示
  11. Linux —— 常见指令及其英文全称
  12. CSUOJ 1111 三家人
  13. Windows Phone开发(6):处理屏幕方向的改变 转:http://blog.csdn.net/tcjiaan/article/details/7273107...
  14. 剑三哪些插件是必备的_日常学习、办公必备的浏览器插件丨附安装教程(三)...
  15. python安装详细步骤windows10_Windows10系统安装Python教程
  16. java生成二维码工具
  17. 亿图图示+linux版本,亿图图示linux版下载
  18. word段落中插入公式后格式编辑
  19. [重要]宝塔面板Linux7.4.3/Windows6.8紧急更新
  20. 微信小程序消息推送至微信公众平台总结

热门文章

  1. QT编写实现图片的幻灯片播放、自适应显示、缩放(以鼠标位置为中心进行缩放)、拖动、重置、显示鼠标位置像素坐标及RGB值、播放GIF动画、截图保存、批量保存、拖入文件夹遍历所有文件
  2. c语言农场,C语言课程设计《开心农场》源码公开
  3. STM32CubeMX基础例程(小熊派):08.实战厨房烟雾监测系统
  4. 了解小猪cms文件结构
  5. html 字体图标 ttf,用FontLab将图标做成字体在网站上显示的方法
  6. 效果参数调用及效果参数解决方向(MTK平台Camera )
  7. Spring全家桶小册,源码实战都有
  8. 网关: 一夫当关,万夫莫开
  9. 大数据在电力行业的应用案例100讲(十)-电力大数据分析模型
  10. 安卓设置EditText回车不换行