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

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

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.