网站首页 > 博客文章 正文
以前对null的处理方式
@Test
public void test01() {
String userName = "凤姐";
// String userName = null;
if (userName != null) {
System.out.println("用户名为:" + userName);
} else {
System.out.println("用户名不存在");
}
}
Optional类介绍
Optional是一个没有子类的工具类,Optional是一个可以为null的容器对象。它的作用主要就是为了解决避免Null检 查,防止NullPointerException。
Optional的基本使用
Optional类的创建方式:
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
Optional类的常用方法:
isPresent() : 判断是否包含值,包含值返回true,不包含值返回false
get() : 如果Optional有值则将其返回,否则抛出NoSuchElementException
orElse(T t) : 如果调用对象包含值,返回该值,否则返回参数t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
@Test
public void test02() {
// Optional<String> userNameO = Optional.of("凤姐");
// Optional<String> userNameO = Optional.of(null);
// Optional<String> userNameO = Optional.ofNullable(null);
Optional<String> userNameO = Optional.empty();
// isPresent() : 判断是否包含值,包含值返回true,不包含值返回false。
if (userNameO.isPresent()) {
// get() : 如果Optional有值则将其返回,否则抛出NoSuchElementException。
String userName = userNameO.get();
System.out.println("用户名为:" + userName);
} else {
System.out.println("用户名不存在");
}
}
Optional的高级使用
@Test
public void test03() {
Optional<String> userNameO = Optional.of("凤姐");
// Optional<String> userNameO = Optional.empty();
// 存在做的什么
// userNameO.ifPresent(s -> System.out.println("用户名为" + s));
// 存在做的什么,不存在做点什么
userNameO.ifPresentOrElse(s -> System.out.println("用户名为" + s)
, () -> System.out.println("用户名不存在"));
}
@Test
public void test04() {
// Optional<String> userNameO = Optional.of("凤姐");
Optional<String> userNameO = Optional.empty();
// 如果调用对象包含值,返回该值,否则返回参数t
System.out.println("用户名为" + userNameO.orElse("null"));
// 如果调用对象包含值,返回该值,否则返回参数Supplier得到的值
String s1 = userNameO.orElseGet(() -> {return "未知用户名";});
System.out.println("s1 = " + s1);
}
@Test
public void test05() {
// User u = new User("凤姐", 18);
// User u = new User(null, 18);
// User u = null;
// System.out.println(getUpperCaseUserName1(u));
// 我们将可能会为null的变量构造成Optional类型
// User u = new User("凤姐", 18);
User u = new User(null, 18);
Optional<User> uO = Optional.of(u);
System.out.println(getUpperCaseUserName2(uO));
}
public String getUpperCaseUserName2(Optional<User> uO) {
return uO.map(u -> u.getUserName())
.map(name -> name.toUpperCase())
.orElse("null");
}
/*public String getUpperCaseUserName1(User u) {
if (u != null) {
String userName = u.getUserName();
if (userName != null) {
return userName;
} else {
return null;
}
} else {
return null;
}
}*/
小结
Optional是一个可以为null的容器对象。orElse,ifPresent,ifPresentOrElse,map等方法避免对null的判断,写出 更加优雅的代码。
猜你喜欢
- 2024-10-09 java.util.Optional学习笔记(java.util.collection)
- 2024-10-09 如何使用Java8 Optional防止空指针异常?开发者:咋不早告诉我呢
- 2024-10-09 Java8新特性-Stream流&Optional类
- 2024-10-09 Java 8 开始新增的 Optional 类 - 创建 Optional 对象
- 2024-10-09 「Java 8」巧用Optional之优雅规避NPE问题
- 2024-10-09 优雅地解决空指针异常问题:Java8新特性之Optional
- 2024-10-09 JDK8中新增的Optional工具类真的很好用哦,建议收藏
- 2024-10-09 还在重复写空指针检查代码?考虑使用 Optional 吧
- 2024-10-09 Java 8 开始新增的 Optional 类 - Optional 对象中的返回
- 2024-10-09 软件开发 | Java8超实用新特性之——Optional解决空指针问题
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)