Java系列文章目录
文章目录
一、前言
目的:对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