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

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));  

(后续补充)


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

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值