Java8新特性Optional类处理空值判断回避空指针异常应用

目录
  • 一、序言
  • 二、问题复原
    • (一)素材准备
    • (二)模拟演示
      • 1、传统方式
      • 2、优雅方式
  • 三、小结

一、序言

空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常。Java8新特性之Optional为此类问题提供了优雅的解决方式。

广大程序员朋友对空值异常刻骨铭心,因此Optional一经推出,广受赞誉。

二、问题复原

(一)素材准备

public class LoginUser implements UserDetails {
    private Long deptId;
    private String token;
    private Long loginTime;
    private Long expireTime;
    private String ipaddr;
    private String loginLocation;
    private String browser;
    private String os;
    private SysUser user;
}
public class SysUser {
    private Long userId;
    private Long deptId;
    private String userName;
}

相关SetterGetter方法自行添加。

(二)模拟演示

1、传统方式

/**
 * 普通嵌套判断方式判断空值
 *
 * @param loginUser 登录用户体
 * @return 用户ID
 */
public Long getUserId(LoginUser loginUser){
    if (loginUser!=null) {
        SysUser user = loginUser.getUser();
        if (user!=null) {
            return user.getUserId();
        }
    }
    return null;
}

方法参数传递的变量loginUser使用前不确定是否为空,因此需要逻辑判断;user变量使用前不确定是否为空,因此需要逻辑判断。两层逻辑判断之后,方能安心调用获取UserId方法。

显而易见,当对象嵌套层次较深时,需要做的逻辑判断越多,代码越复杂。

2、优雅方式

/**
 * 通过Optinal处理空值判断
 *
 * @param loginUser 登录用户体
 * @return 用户ID
 */
public Long getUserId(LoginUser loginUser) {
    return Optional.ofNullable(loginUser)
        .map(LoginUser::getUser).map(SysUser::getUserId).orElse(null);
}

在满足同样需求的前提下,使用Optional类代码量更少,业务逻辑更清晰。

Optional使用方法引用的语法,属于Lambda表达式的一种。

三、小结

本文介绍了Optional类在处理空值判断场景的应用,通过对比的方式,将Optional的优点展现出来。从场景入手学技术比单调的技术讲解更有趣味。

以上就是Java8新特性Optional类处理空值判断回避空指针异常应用的详细内容,更多关于Optional类空值判断回避空指针异常处理的资料请关注我们其它相关文章!

(0)

相关推荐

  • JAVA8如何妙用Optional解决NPE问题详解

    引言 NPE(NullPointerException)是调试程序最常见的异常.google一下有很多关于方法到底应该返回null还是new一个空对象的讨论. 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince(); 这种写法,在user为null时,是有可能报NullPointerException异常的

  • java8新特性之Optional的深入解析

    前言 最近脑袋发热追着java8源码看的很起劲,还有了执念,罪过. 本文以jdk1.8.0_111源码为例 public final class Optional<T> {} Optional是一个为了解决NullPointerException设计而生可以包含对象也可以包含空的容器对象.封装了很多对空处理的方法也增加了filter.map这样的检索利器,其中函数式编程会有种炫酷到爆的感觉. 基础测试用例对象: public class Java8OptionalTest { List<

  • Java8中Optional的一些常见错误用法总结

    前言 Java 8 引入的 Optional 类型,基本是把它当作 null 值优雅的处理方式.其实也不完全如此,Optional 在语义上更能体现有还是没有值.所以它不是设计来作为 null 的替代品,如果方法返回 null 值表达了二义性,没有结果或是执行中出现异常. 在 Oracle  做  Java 语言工作的  Brian Goetz 在 Stack Overflow 回复 Should Java 8 getters return optional type? 中讲述了引入  Opti

  • Java8 Optional判空详解(简化判空操作)

    一.导语 在没有用Optional判空之前,你是否也像下面的代码一样判空呢?如果是,请往下看,Optional 相对传统判空的优势. 传统阶层判空 为什么要用Optional,它到底是什么东西 你也看到了上面的那张图,一旦代码量大起来了,条件多了,代码就会变得很冗余,变得难以维护.那么此时我们就有必要了解Optional了. Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象.Optional 是个容器:它可以

  • 利用Java8 Optional如何避免空指针异常详解

    前言 空指针是我们最常见也最讨厌的异常,为了防止空指针异常,你不得在代码里写大量的非空判断. Java 8引入了一个新的Optional类.用于避免空指针的出现,也无需在写大量的if(obj!=null)这样的判断了,前提是你得将数据用Optional装着,它就是一个包裹着对象的容器. 都说没有遇到过空指针异常的程序员不是Java程序员,null确实引发过很多问题.Java 8中引入了一个叫做java.util.Optional的新类可以避免null引起的诸多问题. 我们看看一个null引用能导

  • Java8 Optional的详细使用教程

    Optional介绍 Optional是Jdk1.8提供的一个新类,希望可以通过该类的引入解决令人烦躁的null判断问题,非常好用.个人理解:这个类是一个包装类,将要操作的java bean封装到该类的对象里面,同时将一些常用的判断逻辑封装为成员方法,结合lambda语法,实现比较优雅的链式调用.现在对Optional的API使用做一个简单的说明. API介绍 Optional的所有的方法如下图所示,这些API大致可以分为以下几类: 1.构建API:构建一个Optional对象:方法有:empt

  • Java8新特性Optional类处理空值判断回避空指针异常应用

    目录 一.序言 二.问题复原 (一)素材准备 (二)模拟演示 1.传统方式 2.优雅方式 三.小结 一.序言 空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常.Java8新特性之Optional为此类问题提供了优雅的解决方式. 广大程序员朋友对空值异常刻骨铭心,因此Optional一经推出,广受赞誉. 二.问题复原 (一)素材准备 public class LoginUser implements UserDetails { private Lo

  • Java8新特性Optional类及新时间日期API示例详解

    目录 Optional类 以前对null的处理 Optional类介绍 Optional的基本使用 Optional的常用方法 新时间日期API 旧版日期时间的问题 新日期时间API介绍 日期时间的常见操作 日期时间的修改和比较 格式化和解析操作 Instant类 计算日期时间差 时间校正器 日期时间的时区 JDK新的日期和时间API的优势 Optional类 面试官:Optional类了解过吗? 这个Optional类主要是解决空指针的问题. 以前对null的处理 @Test public v

  • Java8新特性之空指针异常的克星Optional类的实现

    Java8新特性系列我们已经介绍了Stream.Lambda表达式.DateTime日期时间处理,最后以"NullPointerException" 的克星Optional类的讲解来收尾. 背景 作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了. 这篇文章我们来学习Java8是如何通过Optional类来避免空指针异常的. 先来看一下不使用Optional类时,我们为了防止N

  • Java8中新特性Optional、接口中默认方法和静态方法详解

    前言 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. Java 8是Java的一个重大版本,有人认为,虽然这些新特性领Java开发人员十分期待,但同时也需要花不少精力去学习.下面本文就给大家详细介绍了Java8中新特性Optional.接口中默认方法和静态方法的相关内容,话不多说了,来一起看看详细的介绍吧. Optional Optional 类(java.util.Optional) 是一个

  • 深入理解Java8新特性之Optional容器类的应用

    1.Optional容器类 Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指针异常. 常用方法 : Optional.of(T t) : 创建一个 Optional 实例 Optional.empty() : 创建一个空的 Optional 实例 Optional.ofNullable(T t) : 若 t 不为 null,创建 Opti

  • Java8新特性之线程安全日期类

    LocalDateTime Java8新特性之一,新增日期类. 在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate.LocalTime.LocalDateTime[java8新提供的类] Java8新的时间API的使用方式,包括创建.格式化.解析.计算.修改 可以使用Instant代替 Date,LocalDateTime代替 Calendar,DateTi

  • java8新特性之stream的collect实战教程

    1.list转换成list 不带return方式 List<Long> ids=wrongTmpList.stream().map(c->c.getId()).collect(Collectors.toList()); 带return方式 // spu集合转化成spubo集合//java8的新特性 List<SpuBo> spuBos=spuList.stream().map(spu -> { SpuBo spuBo = new SpuBo(); BeanUtils.c

  • Java8 新特性之日期时间对象及一些其他特性

    日期时间对象 关于日期时间的操作可以分为两种: 转换:与字符串的互相转换,与时间戳的互相转换 计算:计算两个时间点之间的间隔.时间点与时间段的计算(计算下周N.下个月D日.去年M月D日等等) Java8 提供了三个类:LocalDate.LocalTime.LocalDateTime,它们的形式如 2020-01-01.12:30:00.2020-01-01 12:30:00 创建对象 获取类对象的方法非常非常简单 LocalDate now = LocalDate.now(); LocalDa

  • java8新特性之接口默认方法示例详解

    前言 JAVA8 已经发布很久,而且毫无疑问,java8 是自 java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和 JVM 等诸多方面的新特性.Java8 新特性列表如下: 接口默认方法 函数式接口 Lambda 表达式 方法引用 Stream Optional 类 Date API Base64 重复注解与类型注解 接口默认方法 1.什么是接口默认方法 从 Java8 开始,程序允许在接口中包含带有具体实现的方法,使用 default 修饰,这类方法就是默认方法.

  • Java8新特性Stream流实例详解

    什么是Stream流? Stream流是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. Stream的优点:声明性,可复合,可并行.这三个特性使得stream操作更简洁,更灵活,更高效. Stream的操作有两个特点:可以多个操作链接起来运行,内部迭代. Stream可分为并行流与串行流,Stream API 可以声明性地通过 parallel() 与sequential() 在并行流与顺序流之间进行切换.串行流就不必再细说了,并行流主要是为了为了适应目前多核机器的时代,提高系统CP

随机推荐