JDK8 Optional优雅的判空操作

一、前言

在我们编程过程中因为疏忽经常会遇到NullPointerException空指针异常,所以与此同时就避免不了对变量一层一层的进行判空。JDK8新特性所提供的Optional类,可以让我们更优雅的进行判空操作。学习其的意义就是提醒开发者注意空值情况,并在一定程度上优雅处理问题。
例如下图传统判空:
传统判空,下文会展示次写法的解决方案
如上图,一旦代码量大起来了,条件多了,代码就会变得很冗余,变得难以维护,通过使用Optional就可以很好的处理,让我们继续了解。.
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

二、Optional API介绍

首先了解一下Optional为我们提供使用的方法:

在这里插入图片描述
在这里插入图片描述

三、Optional实战

1、对象操作

Optional.of()和Optional.ofNullable()用法相似。
Optional.of()创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException,而Optional.ofNullable()允许传null。
后续以Optional.ofNullable()为例,展示使用optional和不使用的不同写法

1.1 ifPresent(不为null则运行函数体)

如果user不为null则调用其他的方法或操作,例如:

 User user = userService.getById("123456");
 //未使用Optional
  if (user != null){
  	   //执行user不为null的逻辑
       System.err.println(user.getUserName());
   }
// 使用Optional
 Optional.ofNullable(user).ifPresent(u -> System.out.printf(u.getUserName()));

1.2 filter(条件过滤)

    User user = userService.getById("02BEC97B_4CE3_5E6B_7A4C_B03A26D93A9E");
    		//未使用Optional
    if (user != null){
        if (user.getUserName().equals("默认用户")){
            System.out.println("这个是默认用户");
        }
    }
    // 使用Optional
    Optional.ofNullable(user).filter(u-> StringUtils.equals(u.getUserName(),"默认用户")).ifPresent(
            u-> System.out.println("这个是默认用户")
    );

1.3 map+orElse(提取对象属性值,为null提供默认值)

//optional+orElse
String name = Optional.ofNullable(user).map(User::getUserName).orElse("名字为空");

使用map就可以很好的解决逐层判空的目的,例如本文首图示例,用户对象下有教师对象,教师对象下有年轻教师对象,需要获取年轻教师的名字,常规写法则需要先判断用户是否为null,再逐层判断教师、年轻教师对象是否为null,最终取出想要的值。
例如:

//未使用optional
User user = userService.getById("102BEC97B_4CE3_5E6B_7A4C_B03A26D93A9E");
String name = "";
if (user != null) {
    Teacher teacher = user.getTeacher();
    if (teacher != null) {
        YoungTeahcer youngTeacher = teacher.getYoungTeacher();
        if (youngTeacher != null) {
 	        name = youngTeacher.getName();
        }
    }
}
//使用optional
String youngTeacherName = Optional.ofNullable(user)
    .map(User::getTeacher)
    .map(Teacher::getYoungTeacher)
    .map(YoungTeacher::getName).orElse("未查到");

1.4 map+ ifPresent(可用于逐层判断,执行对象属性值不为null之后的逻辑)

//未用optional
User user = userService.getById("102BEC97B_4CE3_5E6B_7A4C_B03A26D93A9E");
if (user!=null){
    if (StringUtils.isBlank(user.getUserId())){
    //执行用户id不为空的逻辑
        System.err.println("111");
    }
}
//使用optional
Optional.ofNullable(user).map(User::getUserName).ifPresent(t-> System.err.println(t));

1.5 map+orElseThrow(提取对象属性值,为null抛异常)

Optional.ofNullable(user).map(User::getUserName).orElseThrow(() ->  new RuntimeException("查询为空"));

1.6 flatMap(Optional对象进行二次包装)

Optional.ofNullable(byId).flatMap(u -> Optional.ofNullable(u.getUserName()));

2、集合操作(集合判空不建议使用optional)

2.1 集合遍历(建议使用CollectionUtil工具类等,例如new List() 使用optional判断值不是null,则会出现问题。)

List<User> list = userService.list();
//未用optional
if (CollectionUtils.isEmpty(list)){
    list.forEach(u->{
        System.out.println(u.getUserName());
    });
}
//使用optional
Optional.ofNullable(list).orElse(new ArrayList<>()).forEach(user -> System.out.println(user.getUserName()));

四、注意事项

上述例子可以看到Optional的相关api可以结合具体场景组合使用,从而达到判空以及简化代码量的目的,但是Optional在一定场景很好用,但其实很多时候简单的if判断同样可以解决问题,反而使用optional不利于可读性,所以更需要从代码的可读性结合具体场景出发。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDK 8引入了一个重要的新特性,即Optional类。Optional类是一个容器对象,它可能包含null值,也可能包含非null值。使用Optional类可以避免空指针异常的发生,并提供了一种更优雅的方式来处理可能为空的值。 Optional类的主要作用是封装一个可能为null的值,并提供一些方法来处理这个值。通过使用Optional类,我们可以在代码中明确地表示一个值可能为空,并在使用这个值时采取相应的处理措施。 下面是一些Optional类的常见用法示例: 1. 创建一个Optional对象: ```java Optional<String> optional = Optional.of("value"); ``` 这里使用`Optional.of()`方法创建一个包含非null值的Optional对象。 2. 检查Optional对象是否包含值: ```java optional.isPresent(); // 返回true,表示Optional对象包含值 ``` 通过`isPresent()`方法可以判断Optional对象是否包含值。 3. 获取Optional对象中的值: ```java optional.get(); // 返回"value" ``` 使用`get()`方法可以获取Optional对象中的值。需要注意的是,如果Optional对象为空,调用`get()`方法会抛出NoSuchElementException异常。 4. 处理Optional对象为空的情况: ```java optional.orElse("default"); // 如果Optional对象为空,返回"default" ``` 使用`orElse()`方法可以指定当Optional对象为空时返回的默认值。 5. 使用Lambda表达式处理Optional对象: ```java optional.ifPresent(value -> System.out.println(value)); ``` `ifPresent()`方法接受一个Lambda表达式作为参数,当Optional对象包含值时,执行Lambda表达式中的逻辑。 以上是Optional类的一些常见用法,使用Optional类可以更加安全地处理可能为空的值,避免空指针异常的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值