JDK8新特性之Optional快速入门

2024-09-05 17:44

本文主要是介绍JDK8新特性之Optional快速入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录标题

  • 1、创建Optional对象
  • 2、值为空时Optional提供的else操作
  • 3、map()转换的操作
  • 4、isPresent()和ifPresent()判断值是否为空
  • 5、filter()过滤值

作为程序猿一定会遇到NullPointerException异常,简称NPE,随之而来的就是为空判断if else。逻辑稍微复杂点,代码就显得不好看了。比如:

public String getCity(User user) throws Exception {if (user != null) {if (user.getAddress() != null) {Address address = user.getAddress();if (address.getCity() != null) {return address.getCity();}}}throw new Excpetion("取值错误");
}

换成JDK8的Optional的写法:

public String getCity(User user) throws Exception {return Optional.ofNullable(user).map(u -> u.getAddress()).map(a -> a.getCity()).orElseThrow(() -> new Exception("取指错误"));
}

代码就会简洁很多。接下来我们一起快速认识一下Optional。


1、创建Optional对象

Optional的本质,就是内部储存了一个真实的value值,在构造的时候,就直接判断其值是否为空。

  • Optional(T value) 私有构造方法,用于创建值为null的Optional对象。
  • empty() public方法,用于创建值为null的Optional对象。
  • of(T value) public方法,用于创建值为value的Optional对象,value不能为空,value为空时代码运行会报错。
  • ofNullable(T value) public方法,用于创建值为value的Optional对象,value可以为空,如果为空则等同于empty()。

用法示例:

@Test
public void test(){Optional<User> op = Optional.of(new User());Useremp = op.get();System.out.println(emp); //正常输出Optional<User> op2 = Optional.empty();System.out.println(op2.get()); //java.util.NoSuchElementException: No value presentOptional<User> op3 = Optional.ofNullable(null);System.out.println(op3.get()); //java.util.NoSuchElementException: No value presentOptional<User> op4 = Optional.ofNullable(new User("张三",18));System.out.println(op4.get()); //正常输出
}

2、值为空时Optional提供的else操作

上面示例可以看到,如果value值为空时,调用op.get()方法会报错。此时我们可以提供else操作。

  • orElse(T other) 如果T为常量值,可以使用。
  • orElseGet(Supplier<? extends T> other) 如果Supplier是创建对象或复杂逻辑操作时,可以使用,因为value值为空时才会调用Supplier。
  • orElseThrow(Supplier<? extends X> exceptionSupplier) 如果value值为空时想抛出异常,可以使用。

代码示例:

@Test
public void test() {User user = null;user = Optional.ofNullable(user).orElse(createUser());user = Optional.ofNullable(user).orElseGet(() -> createUser());user = null;Optional.ofNullable(user).orElseThrow(()->new Exception("用户不存在"));
}public User createUser(){User user = new User();user.setName("zhangsan");return user;
}

3、map()转换的操作

  • map(Function<? super T, ? extends U> mapper) 常用,值转换后在内部封装了一个新的Optional对象。
  • flatMap(Function<? super T, Optional> mapper) 日常用的少,等同于map(),区别是值转换后留给用户封装新的Optional对象。

代码示例:

@Test
public void test(){User user = new User("张三", 18);String userName = Optional.ofNullable(user).map(u-> u.getName()).get();Optional<String> op = Optional.ofNullable(user).flatMap((e) -> Optional.ofNullable(e.getName()));userName = op.get();
}

4、isPresent()和ifPresent()判断值是否为空

  • isPresent() 判断Optional里的value是否为空
  • ifPresent(Consumer<? super T> consumer) 判断Optional里的value值为空为,则执行Consumer

代码示例:

@Test
public void test(){Optional<User> op = Optional.ofNullable(("张三", 18));if (op.isPresent()){// TODO: do something}op.ifPresent(u->{// TODO: do something});
}

5、filter()过滤值

filter(Predicate<? super T> predicate),如果满足过滤条件,那么返回这个 Optional;否则返回 Optional.empty。

代码示例1:

Optional<User> op = Optional.ofNullable(user).filter(u -> u.getAge()>30);

代码示例2:

// 传统写法
public User getUser(User user) throws Exception{if(user!=null){if("张三".equals(user.getName())){return user;}}else{user = new User("张三", 18)return user;}
}// JDK8 Optional的写法
public User getUser(User user) {return Optional.ofNullable(user).filter(e -> "张三".equals(e.getName())).orElseGet(() -> new User("张三", 18));
}

参考《Java 判空新写法!干掉 if else !》

本篇结束。


这篇关于JDK8新特性之Optional快速入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139640

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot