首页 > 编程语言 >Java Optional容器总结(快速上手图解)

Java Optional容器总结(快速上手图解)

时间:2024-08-06 15:24:26浏览次数:13  
标签:Java String User println 图解 Optional public name

Java系列文章目录

Java Lambda表达式总结


文章目录

一、前言

目的:对Optional的使用总结

  • 主要是Optional的总结包含部分Lambda与Stream知识
  • 对B站博主AlbertShen讲的Optional进行笔记总结

二、学习内容:

  • Optional介绍
  • 为什么要引入Optional?
  • Optional的基本使用方法
  • Optional的最佳实践
  • 不合理的使用场景

三、问题描述

本人想加深对Optional表达式的理解

  • Optional容器的实践比较少

四、解决方案:

4.1 引入Optional容器

4.1.1 引入容器的原因

解决null空指针异常
简化null的检查

  • 参考代码
package org.example;

public class User {

    String name;
    String fullName;

    public User(String name, String fullName) {
        this.name = name;
        this.fullName = fullName;
    }

    public String getName() {
        return name;
    }

    public String getFullName() {
        return fullName;
    }
}
package org.example;

public class UserRepository {
	public User findUserByName(String name) {
		if (name.equals("Albert")) {
			return new User( name: "Albert", fullName: "ALbert Shen");
		} else {
			return null;
		}
	}
}
package org.example;

public class Main {
    public static void main(String[] args) {
        UserRepository userRepository = new UserRepository();
        User user = userRepository.findUserByName("Joey1");
        System.out.println(user.getFullName());
    }
}

  • 我们发现当返回值是null的时候会报错

在这里插入图片描述

  • 条件判断过多会导致代码臃肿

在这里插入图片描述

4.2 Optional介绍

Optional 是一个容器对象,用于表示可能存在或不存在的值。
它可以帮助避免空指针异常

在这里插入图片描述

4.3 Optional的使用

4.3.1 关于空值报错的解决方法

  • 存入新的值

在这里插入图片描述

  • 创建空的容器

在这里插入图片描述

  • 判断是否为空容器

在这里插入图片描述

在这里插入图片描述

  • null会报错

如果用ofNullable就允许把null传入
之后返回空的容器

在这里插入图片描述

  • 允许null传入

在这里插入图片描述

  • 获取容器内容
    不建议这样使用
    在这里插入图片描述

4.4 Optional实践

4.4.1 为什么使用Optional方法

方法替代臃肿的条件判断

  • 参考代码
public class UserRepository {
    public Optional<User> findUserByName(String name) {
        if (name.equals("Joey")) {
            return Optional.of(new User("Joey", "My Joey"));
        } else {
            return Optional.empty();
        }
    }

}
  • 这样使用会因为空值报错

在这里插入图片描述

  • 结果会像之前一样使用条件判断

这就是为什么之前不建议使用optional.get()

在这里插入图片描述

  • 我们使用以下代码替代条件判断

此代码替代上面的条件判断

User user = optionalUser.orElse(new User("Joey1", "Joey1"));
System.out.println(user.getFullName());

在这里插入图片描述

  • 学习一下源码

回顾Lambda表达式的应用(复习之前的Lambda表达式相关内容)

在这里插入图片描述

4.4.2 Optional常用方法

包括上面提到的
解释已经在图片里面

在这里插入图片描述

  • 代码如下
package org.example;

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        UserRepository userRepository = new UserRepository();
        Optional<User> optionalUser = userRepository.findUserByName("Joey");

        // orElse 参数不管空还是非空都会执行
        User user = optionalUser.orElse(new User("Joey1", "Joey1"));
        System.out.println(user.getFullName());
        // orElseGet 参数空才会实例化User
        User user1 = optionalUser.orElseGet(() -> new User("Joey1", "Joey1"));
        System.out.println(user1.getFullName());
        //自定义异常
        optionalUser.orElseThrow(() -> new RuntimeException("User not found"));
        //如果有值则执行
        optionalUser.ifPresent(u -> System.out.println(u.getFullName()));
        //相当于if与else
        optionalUser.ifPresentOrElse(
                u -> System.out.println(u.getFullName()),
                () -> System.out.println("User not found")
        );
        //过滤 false返回空对象
        Optional<User> optionalUser1 = optionalUser.filter(u -> u.getName().equals("Joey"));
        System.out.println(optionalUser1.isPresent());
        //Map值的转换返回新的optional对象,空的话返回的也是空
        //optionalUser1.map(User::getFullName);
        Optional<String> optionalFullName = optionalUser1.map(u -> u.getFullName());
    }
}

4.4.2 Map与flatMap区别

在这里插入图片描述

  • 修改下面代码
package org.example;

import java.util.Optional;

public class User {
    String name;
    String fullName;

    public User(String name, String fullName) {
        this.name = name;
        this.fullName = fullName;
    }

    public String getName() {
        return name;
    }

    public Optional<String> getFullName() {
        return Optional.ofNullable(fullName);
    }
}

返回值是Optional的话
使用flatMap可以直接展平放入一个Optional容器

在这里插入图片描述

4.5 不合理的使用场景

  • 作为返回类型使用

返回值可能是null的时候

在这里插入图片描述

  • 作为类型使用开销大

在这里插入图片描述

  • 作为构造函数参数不方便阅读

在这里插入图片描述

解决方法:使用重载方法

在这里插入图片描述

  • 作为方法参数不方便阅读

在这里插入图片描述

解决方法:重载

在这里插入图片描述

  • 不直接使用get()

会有条件判断

在这里插入图片描述

替代方法如下

在这里插入图片描述

  • 不传List到容器

在这里插入图片描述

有更好的解决方法

在这里插入图片描述


五、总结:

5.1 学习总结:

Java中的 Optional 是一个容器对象,用于表示可能存在或不存在的值。它可以帮助避免空指针异常(NullPointerException),使代码更安全和可读。

主要特点:

  • 封装值:Optional 可以持有一个非空值,或为空 ( 看上面解释 )
  • 避免空检查:使用 Optional 可以减少大量的空值检查代码,使逻辑更清晰。

提供方法:Optional 提供了多种方法

  • isPresent():检查值是否存在。
  • get():获取值,保证值存在时调用。
  • orElse():如果值不存在,返回默认值。
  • ifPresent():如果值存在,执行指定的操作。

示例:

Optional<String> optionalValue = Optional.ofNullable(getValue());  

// 检查值是否存在  
if (optionalValue.isPresent()) {  
    System.out.println("Value: " + optionalValue.get());  
} else {  
    System.out.println("Value is not present.");  
}  

// 使用 orElse 提供默认值  
String value = optionalValue.orElse("Default Value");  
System.out.println("Value: " + value);  

// 使用 ifPresent 执行操作  
optionalValue.ifPresent(val -> System.out.println("Value: " + val));  

(后续补充)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

标签:Java,String,User,println,图解,Optional,public,name
From: https://blog.csdn.net/m0_66070037/article/details/140913826

相关文章

  • Java使用POI导出excel记录
    eg:@OverridepublicvoidexportExcel(HttpServletResponseresponse)throwsException{//创建Excel文档XSSFWorkbookworkbook=newXSSFWorkbook();XSSFSheetsheet=workbook.createSheet("设备厂商");//创建表头XSSFRow......
  • Java 类多态的向上转型
     假定Base b = new Derived(); 调用执行b.methodOne()后,输出结果是什么?1publicclassBase2{3publicvoidmethodOne()4{5System.out.print("A");6methodTwo();7}89publicvoidmethodTwo()10{11System.ou......
  • Java 用jetty实现HTTP服务器 获取 Get 请求体
    Java用jetty开发HTTP服务器来获取每次GET请求中的请求体监听本机IP地址 中的 /httpCli 端口5011Main.javapackagecom.JettyServer;importorg.eclipse.jetty.server.Server;importorg.eclipse.jetty.server.handler.ContextHandler;importorg.eclipse.......
  • Java 继承和多态(进阶介绍 十六)
    目录Java继承IS-A关系实例实例instanceof关键字HAS-A关系例子Java多态简单的例子虚方法多态的实现方式方式一:重写方式二:接口Java继承继承是所有OOP语言和Java语言不可缺少的组成部分。继承是Java面向对象编程技术的一块基石,是面向对象的三大特征......
  • Java计算机毕业设计家乐在线家装平台(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的普及和人们生活水平的提高,家装行业正经历着前所未有的变革。传统家装模式存在信息不对称、流程繁琐、效率低下等问题,难以满足消费者日益......
  • Java计算机毕业设计课程在线测评系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,在线教育已成为教育领域的重要组成部分,其灵活性和便捷性受到广大师生的青睐。然而,如何有效评估在线教育的学习效果,确保教学质......
  • Java计算机毕业设计咖啡馆管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着咖啡文化的普及和消费者对品质生活追求的不断提升,咖啡馆作为休闲聚会、商务洽谈的重要场所,其数量与规模在全球范围内迅速增长。然而,传统的手工管......
  • Java计算机毕业设计家教服务网(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,随着教育竞争的日益激烈和家长对孩子教育质量的重视,家教服务已成为许多家庭提升孩子学习成绩、培养综合素质的重要途径。然而,传统的家教服......
  • 基于Java+SpringBoot+Mysql实现的在线电影订票系统部分功能设计与实现五
    一、前言介绍:1.1项目摘要随着互联网技术的飞速发展和普及,人们的娱乐消费方式发生了巨大变化。在线娱乐平台,特别是电影订票系统,成为了现代人观影的主要选择之一。这一变化主要得益于以下几个方面的因素:生活节奏的加快:现代人的生活节奏越来越快,时间变得尤为宝贵。在线电影......
  • 基于Java+SpringBoot+Mysql实现的在线电影订票系统部分功能设计与实现六
    一、前言介绍:1.1项目摘要随着互联网技术的飞速发展和普及,人们的娱乐消费方式发生了巨大变化。在线娱乐平台,特别是电影订票系统,成为了现代人观影的主要选择之一。这一变化主要得益于以下几个方面的因素:生活节奏的加快:现代人的生活节奏越来越快,时间变得尤为宝贵。在线电影......