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) {// 创建一个非空的 OptionalOptional<String> optional1 = Optional.of("Hello");// 创建一个可能为 null 的 OptionalString 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可持久化线段树/平衡树

可持久化&#xff1a; 指的是我们每对树做一次修改&#xff0c;就将其保存为一个历史版本&#xff0c;在以后的询问/修改中&#xff0c;我可以选择任意一个历史版本来询问/修改 实现&#xff1a; 最简单的实现思路&#xff1a; 最简单的思路当然是每次修改的时候都将历史版本…

线程池概念的详解

前言&#x1f440;~ 上一章我们介绍了什么是定时器以及如何去实现一个定时器&#xff0c;今天我们来讲解在多线程中同样很重要的一个内容线程池 线程池的出现 线程池概念 标准库中的线程池 工厂模式 newCacheThreadPool方法 newFixedThreadPool方法 ThreadPoolExecutor…

Akamai+Noname强强联合 | API安全再加强

最近&#xff0c;Akamai正式完成了对Noname Security的收购。本文我们将向大家介绍&#xff0c;经过本次收购后&#xff0c;Akamai在保护API安全性方面的后续计划和未来愿景。 Noname Security是市场上领先的API安全供应商之一&#xff0c;此次收购将让Akamai能更好地满足日益增…

图像基础知识

图像卷积 卷积(convolution)是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分的面积。 卷积概念是两个变量在某范围内相乘后求和的结果。图像处理中的卷积概念:数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积…

Java进阶学习|Day4.Java多线程,线程池

文章目录 了解多线程CPU进程(Process)线程多线程开发多线程优点 实现方式继承Thread类实现Runnable接口实现Callable接口 线程状态转换线程状态线程调度调整线程优先级线程睡眠线程等待线程让步线程加入线程唤醒 线程同步线程同步方式多线程间通信 线程池了解线程池定义常见接口…

可视化作品集(02):应急预警上的应用

应急预警领域是可视化大屏的一个重要应用场景&#xff0c;大屏展示的海量数据能为应急工作提供数据支持&#xff0c;本文带大家看看这类大屏的设计。 可视化大屏在应急和预警领域有广泛的应用&#xff0c; 1. 突发事件监测和应急响应&#xff1a; 可视化大屏可以实时展示突发…

C++设计模式----命令模式

1、介绍 命令模式是⼀种⾏为型设计模式&#xff0c;其允许将请求封装成⼀个对象(命令对象&#xff0c;包含执⾏操作所需的所有信息)&#xff0c;并将命令对象按照⼀定的顺序存储在队列中&#xff0c;然后再逐⼀调用执⾏&#xff0c;这些命令也可以⽀持反向操作&#xff0c;进⾏…

Python库skbio介绍

scikit-bio(简称skbio)是一个用于生物信息学和生态学分析的Python库,提供了丰富的数据处理和分析工具。scikit-bio支持多种生物数据类型,包括序列数据、谱系树、距离矩阵等,并提供了多样性分析、序列对比和统计分析等功能。 安装scikit-bio 安装scikit-bio可以通过Pytho…

顺序表的应用——通讯录的实现

前言 本篇博客将接着上次顺序表的内容进行拓展应用&#xff0c;这次来为大家介绍通讯录的实现&#xff0c;它就是基于顺序表的结构完成的&#xff1b;如果你对此感兴趣&#xff0c;请看下面的内容&#xff1b; 1.顺序表的应用 我们前面学过&#xff0c;顺序表可以存放任意类…

Android Gradle开发与应用Gradle详细使用

一、Gradle 基础知识 1. Gradle 构建脚本 Gradle 构建脚本通常使用 Groovy 或 Kotlin DSL 编写。Android 项目中有两个主要的 Gradle 构建脚本&#xff1a; a、项目级构建脚本 (build.gradle 或 build.gradle.kts)&#xff1a;位于项目的根目录中&#xff0c;用于配置项目范…

Java | Leetcode Java题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution {public String shortestPalindrome(String s) {int n s.length();int[] fail new int[n];Arrays.fill(fail, -1);for (int i 1; i < n; i) {int j fail[i - 1];while (j ! -1 && s.charAt(j 1) ! s.charAt…

ASP.NET Core Blazor 5:Blazor表单和数据

本章将描述 Blazor 为处理 HTML 表单提供的特性&#xff0c;包括对数据验证的支持。 1 准备工作 继续使用上一章项目。   创建 Blazor/Forms 文件夹并添加一个名为 EmptyLayout.razor 的 Razor 组件。本章使用这个组件作为主要的布局。 inherits LayoutComponentBase<div …

【Mojo开发新纪元】探索CSS预处理器的集成之路

标题&#xff1a;【Mojo开发新纪元】探索CSS预处理器的集成之路 Mojolicious是一个基于Perl的现代且高性能的Web开发框架&#xff0c;它提供了一套丰富的工具来简化Web开发过程。随着前端技术的发展&#xff0c;CSS预处理器如Sass和Less因其强大的功能和灵活性&#xff0c;已经…

论文 | PRCA: 通过可插拔奖励驱动的上下文适配器拟合用于检索问答的黑盒大语言模型

论文全称&#xff1a;PRCA: Fitting Black-Box Large Language Models for Retrieval Question Answering via Pluggable Reward-Driven Contextual Adapter 核心问题&#xff1a;如何在检索增强式问答&#xff08;ReQA&#xff09;任务中&#xff0c;利用大型语言模型&#xf…

Java面试题:sql优化

表的设计的优化 参考阿里开发手册(嵩山版) 设置合适数值类型(tinyint,int,bigint) 设置合适的字符串类型(char,varchar) 索引优化 SQL语句优化 需要指明字段名称,避免直接使用select*,导致回表查询 避免造成索引失效的写法 尽量用union all代替union,union会多一次过滤…

【C语言入门】初识C语言:掌握编程的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C语言入门 &#x1f4d2;1. 选择…

Mac OS M3 安装 Docker 并解决芯片不支持问题

有点儿无语&#xff0c;好不容易从Docker官网下载 Apple Chip版本&#xff0c;安装挺快&#xff0c;一试废了。docker --version命令执行挺好&#xff0c;但一下载镜像常用的alpine不能运行。 经查询资料尝试选择了替代品 OrbStack目前感觉挺好用。官网&#xff1a;https://or…

在Linux系统中使用阿里云镜像源安装和配置Docker的详细教程

很多国内小伙伴在Linux上安装Docker经常会遇到网络不可达的问题。那么我们可以使用阿里云镜像来完成Docker的安装&#xff0c;这里是如何在 CentOS 上使用阿里云的 Docker 镜像源的步骤&#xff1a; 1. 删除已有的 Docker 仓库 如果之前添加了任何 Docker 仓库&#xff0c;先…

有哪些AI绘画软件?

以下是一些比较知名的AI绘画软件&#xff1a; 1、DeepArt&#xff1a;基于深度学习技术&#xff0c;可以将照片转换成各种艺术风格的绘画。 2、Artbreeder&#xff1a;通过生成对抗网络&#xff08;GAN&#xff09;&#xff0c;允许用户混合和匹配图像以创建新的艺术作品。 …

单片机关键任务优先级的实现学习

与总体产品联调时&#xff0c;需要各个单机系统严格按照总体要求&#xff0c;进行数据输出&#xff0c;时间的偏差将出现系统异常&#xff0c;控制失败等不稳定情况产生&#xff0c;甚至影响到产品安全。 因此必须确保某些关键任务的优先执行。单片机任务优先级一般有两种方式…