Java学习十二—Java8特性之Optional类

一、简介

Java 8 引入了 Optional​ 类作为一种容器,可以用来显式地表示一个值存在或不存在。它解决了传统上可能会遇到的空指针异常问题,同时提供了一种更优雅的方式来处理可能为null的情况。

image222

Java 8 中引入 Optional​ 类的背景可以从以下几个方面来理解:

  1. 空指针异常问题: 在 Java 中,空指针异常(NullPointerException)是一个常见的问题,特别是当处理可能为null的对象时。这种异常可能会在运行时导致程序崩溃,难以调试和处理。
  2. 编程语言发展趋势: 在 Java 8 发布之前,其他一些现代编程语言(如Scala、Swift等)已经引入了类似的 Option 类型或者可空类型(Nullable Type),这些类型可以更安全和清晰地处理可能为空的值。
  3. 函数式编程的影响: Java 8 引入了函数式编程的元素,例如 lambda 表达式和流式 API。在函数式编程中,避免副作用和空值处理是重要的理念之一,因此需要一种适合函数式编程风格的空值处理机制。
  4. 更优雅的代码风格: 使用 Optional​ 类可以使代码更加清晰和优雅。通过强制显式处理可能为null的情况,可以减少条件判断和嵌套,提高代码的可读性和可维护性。
  5. API 设计的进步: 引入 Optional​ 类使得 Java 标准库的 API 设计更加完善和一致。在一些情况下,例如集合操作中的元素查找或者返回值可能为空的方法,使用 Optional​ 可以更准确地表达返回值的可能性。

综上所述,Java 8 引入 Optional​ 类旨在提供一种更加安全、清晰和优雅的方式来处理可能为null的值,以及促进函数式编程风格在 Java 中的应用。

二、类申明

public final class Optional<T> 

image

三、方法

以下是 Optional​ 类的一些常用方法:

  1. Optional.of(T value) ​ - 创建一个 Optional​ 实例,其非空值由给定的参数指定。如果给定的参数为 null​,则抛出 NullPointerException​。
  2. Optional.ofNullable(T value) ​ - 创建一个 Optional​ 实例,其值可以是 null​。如果给定的参数为 null​,则返回一个空的 Optional​ 对象。
  3. Optional.empty() ​ - 返回一个空的 Optional​ 实例。
  4. Optional.isPresent() ​ - 检查 Optional​ 是否包含非空值。如果包含非空值,则返回 true​,否则返回 false​。
  5. Optional.ifPresent(Consumer<? super T> consumer) ​ - 如果 Optional​ 包含非空值,则将该值传递给提供的 Consumer​ 对象。如果 Optional​ 是空的,则不执行任何操作。
  6. Optional.orElse(T other) ​ - 如果 Optional​ 包含非空值,则返回该值;否则返回提供的其他值。
  7. Optional.orElseGet(Supplier<? extends T> other) ​ - 如果 Optional​ 包含非空值,则返回该值;否则返回由 Supplier​ 调用返回的值。
  8. Optional.orElseThrow() ​ - 如果 Optional​ 包含非空值,则返回该值;否则抛出 NoSuchElementException​。
  9. Optional.map(Function<? super T,? extends U> mapper) ​ - 如果 Optional​ 包含非空值,则将该值传递给提供的 Function​ 对象,并返回结果包装在 Optional​ 中。如果 Optional​ 是空的,则返回空的 Optional​。
  10. Optional.flatMap(Function<? super T, Optional<? extends U>> mapper) ​ - 如果 Optional​ 包含非空值,则将该值传递给提供的 Function​ 对象,并返回 Function​ 返回的 Optional​。如果 Optional​ 是空的,或者 Function​ 返回空的 Optional​,则返回空的 Optional​。
  11. Optional.filter(Predicate<? super T> predicate) ​ - 如果 Optional​ 包含非空值,并且该值满足提供的 Predicate​,则返回包含该值的 Optional​。如果 Optional​ 是空的,或者非空值不满足 Predicate​,则返回空的 Optional​。

四、示例

4.1示例1

Optional<String> optional = Optional.of("bam");

optional.isPresent();           // true
optional.get();                 // "bam"
optional.orElse("fallback");    // "bam"

optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "b"

4.2示例2

创建 Optional 对象:

  • of(T value) 创建一个包含指定非null值的 Optional。

    Optional<String> optional = Optional.of("Hello");
    
  • ofNullable(T value) 创建一个可能为null的 Optional 对象。

    String str = null;
    Optional<String> optional = Optional.ofNullable(str);
    
  • empty() 创建一个空的 Optional 对象。

    Optional<String> optional = Optional.empty();
    

判断值是否存在:

  • isPresent() 如果存在值,则返回true,否则返回false。

    Optional<String> optional = Optional.of("Hello");
    if (optional.isPresent()) {
        // 值存在时的操作
        System.out.println("Value is present: " + optional.get());
    } else {
        // 值不存在时的操作
        System.out.println("Value is absent.");
    }
    

获取值或默认值:

  • get() 如果存在值,则返回该值,否则抛出 NoSuchElementException​。

    Optional<String> optional = Optional.of("Hello");
    String value = optional.get();
    
  • orElse(T other) 如果存在值,则返回该值,否则返回指定的默认值。

    Optional<String> optional = Optional.ofNullable(null);
    String result = optional.orElse("Default Value");
    
  • orElseGet(Supplier<? extends T> other) 如果存在值,则返回该值,否则使用提供的 Supplier 生成一个默认值。

    Optional<String> optional = Optional.ofNullable(null);
    String result = optional.orElseGet(() -> "Default Value");
    

条件式操作:

  • filter(Predicate<? super T> predicate) 如果存在值并且满足给定条件,则返回包含该值的 Optional,否则返回空的 Optional。

    Optional<String> optional = Optional.of("Hello");
    Optional<String> filtered = optional.filter(s -> s.startsWith("H"));
    
  • map(Function<? super T, ? extends U> mapper) 如果存在值,则对其进行转换,并返回包含转换后值的 Optional,否则返回空的 Optional。

    Optional<String> optional = Optional.of("Hello");
    Optional<String> upperCase = optional.map(String::toUpperCase);
    
  • flatMap(Function<? super T, Optional<U>> mapper) 如果存在值,则对其进行转换并返回结果,否则返回空的 Optional。

    Optional<String> optional = Optional.of("Hello");
    Optional<String> flatMapped = optional.flatMap(s -> Optional.of(s + " World"));
    

条件式执行:

  • ifPresent(Consumer<? super T> consumer) 如果存在值,则执行指定的操作。

    Optional<String> optional = Optional.of("Hello");
    optional.ifPresent(s -> System.out.println("Value is present: " + s));
    

示例:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        // 创建一个非空的 Optional
        Optional<String> optional1 = Optional.of("Hello");

        // 创建一个可能为 null 的 Optional
        String str = null;
        Optional<String> optional2 = Optional.ofNullable(str);

        // 判断值是否存在
        if (optional1.isPresent()) {
            System.out.println("Value 1 is present: " + optional1.get());
        } else {
            System.out.println("Value 1 is absent.");
        }

        // 使用 orElse 方法提供默认值
        String result = optional2.orElse("Default Value");
        System.out.println("Value 2: " + result);

        // 使用 map 对值进行转换
        Optional<String> upperCaseOptional = optional1.map(String::toUpperCase);
        upperCaseOptional.ifPresent(s -> System.out.println("Uppercase value: " + s));

        // 使用 flatMap 进行链式操作
        Optional<String> flatMapped = optional1.flatMap(s -> Optional.of(s + " World"));
        flatMapped.ifPresent(s -> System.out.println("FlatMapped value: " + s));
    }
}

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/770417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu查看opencv版本c++

✗命令行中直接输入&#xff1a; pkg-config --modversion opencv✔命令行中直接输入&#xff1a; pkg-config --modversion opencv4注解&#xff1a;附上在markdown中打勾&#xff0c;对号和打叉。使用时将&和#之间的空格去掉&#xff0c;这里只是为了不让CSDN自动转换才…

内容监管与自由表达:Facebook的平衡之道

在当今数字化信息社会中&#xff0c;社交媒体平台不仅是人们交流和获取信息的主要渠道&#xff0c;也是自由表达的重要舞台。Facebook&#xff0c;作为全球最大的社交网络平台&#xff0c;连接了数十亿用户&#xff0c;形成了一个丰富多样的信息生态。然而&#xff0c;如何在维…

怎么加密CAD图纸丨企业级图纸加密软件排行榜

我们为什么需要一款好用的图纸加密软件&#xff1f; CAD图纸包含企业的核心设计和技术&#xff0c;是宝贵的知识产权。加密软件可以防止未经授权的人员获取和复制这些设计。 通过加密&#xff0c;可以有效防止CAD图纸在传输或存储过程中被窃取或泄露&#xff0c;特别是在互联…

软考的报名详细流程

2024年软考的考试时间已经公布&#xff0c;分别为5月25日至28日和11月9日至12日。准备参加2024年软考的朋友们&#xff0c;一定要提前关注官方发布的考试安排。 本文将详细介绍软考报考的整个流程。准备报考的朋友们&#xff0c;阅读本文就足够啦&#xff01;软考的报考流程大致…

面向高精度导航定位领域的UM980RTK定位模块

UM980 是和芯星通自主研发的新一代 BDS/GPS/GLONASS/Galileo/QZSS 全系统全频高精度 RTK 定位模块&#xff0c;基于和芯星通自主研发的新一代射频基带及高精度算法一体化GNSS SoC 芯片—NebulasIV 设计。可同时跟踪 BDS, GPS, GLONASS, Galileo, QZSS, NavIC, SBAS, L-Band* 等…

docker容器间网络仿真工具-pumba

docker-tc&pumba docker-tc:docker-tc项目仓库 pumba:pumba项目仓库 这两个项目理论上都可以实现对容器间的网络环境进行各种模拟干预&#xff0c;包括延迟&#xff0c;丢包&#xff0c;带宽限制等。 但是我在实际使用时&#xff0c;发现docker-tc这个工具在进行网络进行模…

大屏开发系列——Echarts的基础使用

本文为个人近期学习总结&#xff0c;若有错误之处&#xff0c;欢迎指出&#xff01; Echarts在vue2中的基础使用 一、简单介绍二、基本使用&#xff08;vue2中&#xff09;1.npm安装2.main.js引入3.使用步骤(1)准备带有宽高的DOM容器&#xff1b;(2)初始化echarts实例&#xff…

React+TS前台项目实战(二十五)-- 全局常用排序组件SortButton封装

文章目录 前言SortButton组件1. 功能分析2. 代码详细注释3. 使用到的全局hook代码4. 使用方式5. 效果展示 总结 前言 今天要封装的SortButton 组件&#xff0c;主要用在表格列排序上&#xff0c;运用于更新路由并跳转更新&#xff0c;起到刷新页面仍然处于当前排序数据。 Sor…

2024最新PyCharm安装教程(附激活码)

今天讲解的是PyCharm安装教程 一、软件简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外…

鸿翼ECM统一AI检索应用全景,为企业打造全方位搜索服务

随着企业的发展和信息化进程的加快&#xff0c;海量数据已沉淀至企业各类系统&#xff0c;系统间信息孤立、信息利用率低、数据价值无法发挥成为制约企业发展的重要因素。如何对散落在企业各系统中的数据、内容进行统一管理和高效利用&#xff0c;实现高效精准的信息检索&#…

手把手教你一步一步通过AI助手生成利润表分析报告

AI助手之利润表分析报告-操作篇 以下为文字整理部分&#xff1a; 如果要手工制作一份这样的利润分析报告大概要多久时间&#xff1f;从准备数据做成表格&#xff0c;到完成报告&#xff0c;至少需要1天的时间吧&#xff0c;特别是敲文字报告的时候&#xff0c;生怕把数字搞错要…

springboot水环境检测系统的设计与实现-计算机毕业设计041446

摘 要 在我国,水源的污染是不可忽视的问题。对于水质监测进行数据的采集工作,目前主要通过人工实现。因此,部分地区的采集工作,实施起来难度很大,比如恶劣环境和偏僻山区等地。所以,目前对于水质监测的研究,主导方向是建立更加高效完善,智能化的水质监测系统。近几年,无线传感器…

工业 web4.0UI 风格品质卓越

工业 web4.0UI 风格品质卓越

STM32 Cannot access memory

问题描述 最近自己做了一块STM32F103ZET6的板子&#xff0c;在焊接完成后可以在下载器界面看到idcode&#xff0c;但烧录时报错 Cannot access memory 。 解决办法 测量STM32各个供电项&#xff0c;发现时33脚处VDDA电压只有1.8V&#xff0c;是因为R3电阻过大&#xff0c;…

成都欣丰洪泰文化传媒有限公司开网店可靠吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业无疑是这场浪潮中的佼佼者。而在这波汹涌的电商大潮中&#xff0c;成都欣丰洪泰文化传媒有限公司凭借其专业的电商服务能力和前瞻的市场洞察力&#xff0c;成为了业界的一匹黑马。今天&#xff0c;就让我们一起揭开这家专注于电…

CANoe的capl调用Qt制作的dll

闲谈 因为Qt封装了很多个人感觉很好用的库&#xff0c;所以一直想通过CAPL去调用Qt实现一些功能&#xff0c;但是一直没机会&#xff08;网络上也没看到这方面的教程&#xff09;&#xff0c;这次自己用了两天&#xff0c;踩了很多坑&#xff0c;终于是做成了一个初步的调用方…

Chirp信号生成(FPGA、基于cordic IP核)

一、Chirp生成模块介绍 采用Verilog 生成Chirp&#xff0c;实现输入使能电平&#xff0c;模块输出Chirp信号&#xff0c;Chirp信号频率范围&#xff0c;时间宽度&#xff0c;连续Chirp信号数量可配置。 二、模块例化方法示例 parameter FL d20_000 ; parameter FH…

linux centos tomcat 不安全的HTTP请求方法

1、页面查看 2、在linux主机可使用此命令查看 curl -v -X OPTIONS http://实际地址 3、进入tomcat conf目录vim web.xml&#xff0c;增加以下内容 <!-- close insecure http methods --> <security-constraint><web-resource-collection><web-resource…

springboot项目接入prometheus并展示到grafana

背景 随着业务发展&#xff0c;服务的健康指标变得越来越重要&#xff0c;监控服务的健康指标成为很多公司必要需求。 Prometheus 介绍 Prometheus是一个开源的监控和警报工具集&#xff0c;最初由SoundCloud构建。它自2012年以来已成为许多公司和组织监控其IT基础设施的首选解…

深入了解 Redis 五种类型命令与如何在 Java 中操作 Redis

文章目录 Redis 五种类型命令在 Java 中操作 Redis使用 Spring Data Redis 简化操作 总结 &#x1f389;欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;SpringBoot…