java8 Optional使用总结
【前言】 java8新特性
java8 函数接口
java8 lambda表达式
Java 8 时间日期使用
java8 推出的Optional的目的就是为了杜绝空指针异常,帮助开发者开发出更优雅的代码,使用Optional不正确时,将会违背设计者的初衷。
一、Optional的构造方式:
1、Optional.of(T)
该方式的入参不能为null,否则会有NPE,在确定入参不为空时使用该方式。
2、Optional.ofNullable(T)
该方式的入参可以为null,当入参不确定为非null时使用。
3、Optional.empty()
这种方式是返回一个空Optional,等效Optional.ofNullable(null)
二、 如何正确使用Optional
尽量避免使用的地方:
1、避免使用Optional.isPresent()来检查实例是否存在,因为这种方式和null != obj没有区别,这样用就没什么意义了。
2、避免使用Optional.get()方式来获取实例对象,因为使用前需要使用Optional.isPresent()来检查实例是否存在,否则会出现NPE问题。
3、避免使用Optional作为类或者实例的属性,而应该在返回值中用来包装返回实例对象。
4、避免使用Optional作为方法的参数,原因同3。
正确使用方式:
1、实例对象存在则返回,否则提供默认值或者通过方法来设置返回值,即使用orElse/orElseGet方式:
//存在则返回
User king = new User(1, "king");
Optional<User> userOpt = Optional.of(king);
User user = userOpt.orElse(null);
System.out.println(user.getName());
//不存在提供默认值
User user2 = null;
Optional<User> userOpt2 = Optional.ofNullable(user2);
User user3 = userOpt2.orElse(unknown);
System.out.println(user3.getName());
//通过方法提供值
User user4 = userOpt2.orElseGet(() -> new User(0, "DEFAULT"));
System.out.println(user4.getName())
不建议这样使用:
if(userOpt.isPresent()) {
System.out.println(userOpt.get().getName());
} else {
//。。。
}
2、使用ifPresent()来进行对象操作,存在则操作,否则不操作。
//实例存在则操作,否则不操作
userOpt.ifPresent(u -> System.out.println(u.getName()));
userOpt2.ifPresent(u -> System.out.println(u.getName()));
3、使用map/flatMap来获取关联数据
//使用map方法获取关联数据
System.out.println(userOpt.map(u -> u.getName()).orElse("Unknown"));
System.out.println(userOpt2.map(u -> u.getName()).orElse("Default"));
//使用flatMap方法获取关联数据
List<String> interests = new ArrayList<String>();
interests.add("a");interests.add("b");interests.add("c");
user.setInterests(interests);
List<String> interests2 = Optional.of(user)
.flatMap(u -> Optional.ofNullable(u.getInterests()))
.orElse(Collections.emptyList());
System.out.println(interests2.isEmpty());
三、总结
以上对于Optional的使用只是个人经常使用的一些总结,如有不对之处望纠正。正确使用Optiona不仅可以避免NPE问题,还可以使代码看起来更加简洁。
java8 Optional使用总结的更多相关文章
- Java8 Optional的简单操作
我们经常会遇到这种情况:首先判断一个对象是否为null,如果不为null,获取一个对象中的一个属性,如果该属性不为null,又获取该属性的属性,如果该属性的属性不为null,又获取属性的属性的属性: ...
- java8 Optional优雅非空判断
java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...
- Java8 Optional && Guava Optional
Java8 -- Optional boolean isPresent():与obj != null()一样:调用get()前要调用isPresent()检查,不然会报错 Optional的三种构造方 ...
- java代码之美(16) ---Java8 Optional
Java8 Optional 一句话介绍Optional类:使用JDK8的Optional类来防止NullPointerException(空指针异常)问题. 一.前言 在我们开放过程中,碰到的异常中 ...
- 聊一聊Java8 Optional,让你的代码更加优雅
码农在囧途 随着时间的推移,曾经我们觉得重要的东西,可能在今天看来是如此的浅薄和无知,同理,今天我们放不下,想不开,觉得重要的东西,多年后我们可能也会觉得也就那样,所以,今天的的所有烦恼,忧愁,想不开 ...
- 使用 Java8 Optional 的正确姿势(转)
我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointException 的问题, 于是代 ...
- Java8 Optional类
概述 到目前为止,著名的NullPointerException是导致Java应用程序失败的最常见原因.过去,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guav ...
- java8 Optional正确使用姿势
Java 8 如何正确使用 Optional import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; ...
- java8 - Optional
mport java.util.Optional; import org.junit.Test; /* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) ...
随机推荐
- 关于工作流引擎ccflow待办分类 研究与技术实现
关于工作流引擎待办分类 研究与技术实现 关键字:工作流引擎 BPM系统 待办类型 名词:待办 概要介绍:待办就是当前的登录人员要处理的工作,在工作流程里面的节点类型不同,业务场景不同,我们把待办分为如 ...
- 牛客-小a的旅行计划 + 数学推导
小a的旅行计划 题意: 小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为,同时小b也想出去游玩.由于一些特殊♂原因,他们的旅行计划必须满足一些条件 首先,他们可以从这N个景点中任意选 ...
- hdu2586 How far away ?(lca模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵树还有两个点然后求这两个点的最短距离. 题解:val[a]+val[b]-2*va ...
- spring的嵌套事务
转自http://www.iteye.com/topic/35907 在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看, 绝大多数人并不能深刻 ...
- avalon.js与 ajax使用的一个错误实例
http://www.cnblogs.com/smallstudent/diary/2016/04/06/5360605.html
- Java开学测试
这次开学测试要求做一个信息系统,该系统完成学生成绩录入,修改,计算学分积点和查询学生成绩的简单功能. 下面是我写的代码 //信1805-3班 20183641 赵树琪 package test; im ...
- 使用图灵机器人api搭建微信聊天机器人php实现
之前通过hook技术实现了微信pc端发送消息功能,如果在结合图灵机器人就能实现微信聊天机器人. 代码下载:http://blog.yshizi.cn/131.html 逻辑如下: 下面我简单介绍一下步 ...
- 增强学习Q-learning分析与演示(入门)
一些说明.参阅 https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master/contents/1_ ...
- spring接口文档注解:@ApiOperation(转)
spring接口文档注解:@ApiOperation @ApiOperation不是spring自带的注解是swagger里的 com.wordnik.swagger.annotations.ApiO ...
- 解决python -m pip install --upgrade pip 升级不成功问题
1.使用命令出现. You are , however version is available. You should consider upgrading via the 'python -m p ...