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

相关文章

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程