当前位置: 首页 > article >正文

JAVA8新特性——Optional

Optional 是 Java 8 引入的新特性之一,它是一个容器类,代表一个可能包含或者不包含实际对象的值。其目的是为了减少代码中空指针异常(NullPointerException)的发生,并使得代码更加安全和易读。使用 Optional 可以避免直接返回 null,从而减少空值检查。

Optional对象的创建

Optional 类提供了几种创建方式:

Optional.of(T value):当值非 null 时使用此方法创建 Optional 对象,如果传入 null,将抛出 NullPointerException。
Optional.empty():创建一个没有值的 Optional 对象。
Optional.ofNullable(T value):允许传入 null 值,如果值为 null,则返回一个空的 Optional,否则返回包含该值的 Optional。
我们一般采用第三种方式创建Optional对象

demo
Author author = getAuthor();
Optional<Author> authorOptional = Optional.ofNullable(author);
Optional.ofNullable的等价写法
public static Optional<Author> getAuthorOptional(){
        Author author = new Author(1L, "蒙多", 33, "eee", null);
        //return Optional.ofNullable(author); //这种创建Optional的方法可以等价于下面这种
        return author == null ? Optional.empty() : Optional.of(author);
    }

我们一般使用Optional的静态方法ofNullable来把数据封装成一个Optional对象,无论传入的参数是否为null都不会出现问题

安全的消费值

我们获取Optional对象后肯定需要对其中的数据进行使用,这时候我们可以使用ifPresent方法来消费其中的值。该方法会判断封装的数据是否为空,不为空时才执行具体的消费代码,这样就更加安全了。

demo
import java.util.Optional;
import java.util.function.Consumer;

public class OptionalDemo {
    public static void main(String[] args) {
        Author author = getAuthor();
        Optional<Author> authorOptional = Optional.ofNullable(author);
       authorOptional.ifPresent(author12 -> System.out.println(author12.getName()));
    }
}

获取值

我们可以通过get方法获取值。如果存在值,则返回该值,否则抛出 NoSuchElementException.很显然,因为可能抛出异常,所以我们不推荐这种方式。

import java.util.Optional;
import java.util.function.Consumer;

public class OptionalDemo {
    public static void main(String[] args) {
        Optional<Author> authorOptional1 = getAuthorOptional();
        Author author1 = authorOptional1.get();
        System.out.println(author1);
    }

    public static Optional<Author> getAuthorOptional(){
        Author author = new Author(1L, "蒙多", 33, "eee", null);
        return Optional.ofNullable(author); //这种创建Optional的方法可以等价于下面这种
        //return author == null ? Optional.empty() : Optional.of(author);
    }
}

安全获取值

orElseGet(Supplier<T> supplier):如果有值则返回该值,否则返回由 Supplier 提供的值。

Optional<Author> authorOptional1 = getAuthorOptional();
        authorOptional1.orElseGet(new Supplier<Author>() {
            @Override
            public Author get() {
                return new Author();
            }
        });

orElseThrow(Supplier<? extends Throwable> exceptionSupplier):如果有值则返回该值,否则抛出由 Supplier 创建的异常。

Optional<Author> authorOptional1 = getAuthorOptional();
authorOptional1.orElseThrow((Supplier<Throwable>) () -> new RuntimeException("数据为null"));

过滤

filter(Predicate<T> predicate):参考Stream

判断

isPresent():如果存在值则返回 true

数据转换

map 方法接收一个函数作为参数,并将其应用于Optional中的值,返回一个新的Optional对象,该对象包含应用函数后的结果。如果原始的Optional对象为空,则返回的Optional也是空的。参考Stream


http://www.kler.cn/a/313208.html

相关文章:

  • Vue 的生命周期函数 和 Vuex
  • 前端垂直居中的多种实现方式及应用分析
  • WebSocket和HTTP协议的性能比较与选择
  • 【stable diffusion部署】超强AI绘画Stable Diffusion,本地部署使用教程,完全免费使用
  • Spark:不能创建Managed表,External表已存在...
  • 学术论文写作丨机器学习与深度学习
  • Dockerfile部署xxljob
  • FactualSceneGraph场景图生成
  • OpenAI或于9月24日发布ChatGPT高级语音模式
  • 小白src挖掘 | 记某证书站的虚拟仿真实验平台
  • 提升效率的AI工具集 - 轻松实现自动化
  • ValueError: pic should not have > 4 channels. Got XXX channels.
  • navicat无法连接远程mysql数据库1130报错的解决方法
  • 书生·浦语作业集合
  • AI学习指南深度学习篇-Adam超参数调优与性能优化
  • 神经网络推理加速入门——一个例子看懂流水
  • Redis基础(数据结构和内部编码)
  • (黑马点评)八、实现签到统计和uv统计
  • 使用 Rust 和 wasm-pack 开发 WebAssembly 应用
  • SHT30温湿度传感器详解(STM32)
  • 【Linux】线程池(第十八篇)
  • 云计算第四阶段------CLOUD Day4---Day6
  • SpringBoot实现OAuth客户端
  • SQL编程题复习(24/9/20)
  • FPGA基本结构和简单原理
  • Mac下nvm无法安装node问题