Java8 Optional详解
在Java8中新增了一个Optional
类,官方描述是该类是一个容器对象,其中可能包含一个空或非空的值。如果存在一个值,isPresent()
将返回true,get()
将返回该值。
错误使用姿势
简单的根据描述,我们认为Optional可以帮我们解决NPE问题,假设任务需求为获取用户的性别,那么可以这样写:
Optional<User> user = ...
if(user.isPresent()) {return user.get().getSex();
} else {return null;
}
其实这样并没有改变原本的思维, 只是本能的认为该类是 User 实例的包装, 这与下面的写法没有本质的区别:
User user = ...
if(user != null) {return user.getSex();
} else {return null;
}
正确使用姿势
想要正确的使用,得知道有哪些方法,下面我列出一些常用的API:
Modifier and Type | Method | Description |
---|---|---|
static < T > Optional< T > | empty() | 返回一个空的Otptional实例 |
static < T > Optional< T > | of(T value) | 传入的值必须非null,否则抛出NPE |
static < T > Optional< T > | ofNullable(T value) | 当传入null时,返回空的Optional实例 |
< U > Optional< U > | map(Function mapper) | 如果值存在,则将所提供的映射函数应用于该函数,否则返回一个描述结果的可选项 |
T | orElse(T other) | 如果值存在返回该值,否则返回传入的值 |
T | orElseGet(Supplier other) | 如果值存在返回该值,否则调用其他值并返回该调用的结果 |
void | ifPresent(Consumer consumer) | 当值存在时执行参数上的语句 |
Optional< T > | filter(Predicate predicate) | 当值存在且符合指定规则返回该值,否则返回null |
< X extends Throwable> T | orElseThrow(Supplier exceptionSupplier) | 如果值存在返回该值,否则抛出指定异常 |
前三个为构造方法,一般使用ofNullable
即可,因为它能智能的判断参数是否为null,但是该方法也不是一劳永逸的,否则也没必要外露另外两个构造方法,如果我们明确的知道参数为非null或不允许任何null值的存在,可以使用of
。
对于其他方法,给出例子相信能很快理解:
/* ===== 得到User实例 ==== */// 等价于 return user.isPresent() ? user.get() : null;
return user.orElse(null); // 等价于 return user.isPresent() ? user: getNewUser();
return user.orElseGet(() -> getNewUser());/*等价于 if (user.isPresent()) { System.out.println(user.get()); }*/
user.ifPresent(System.out::println);
/* ===== 得到User.sex ==== *//*等价于:if(user.isPresent()) {return user.get().getSex();} else {return "男";}
*/
return user.map(u -> u.getSex()).orElse("男");
总结:使用 Optional
时尽量不直接调用 Optional.get()
方法, Optional.isPresent()
更应该被视为一个私有方法, 应使用像 Optional.orElse()
, Optional.orElseGet()
, Optional.map()
等这样的方法。
Java8 Optional详解相关推荐
- 【java8新特性】——Optional详解(三)
一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null ...
- Optional 详解 Java
Optional的使用详解 1.Optional介绍 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Opt ...
- java optional详解_java8中Optional的用法详解
package com.lyzx.concurrent.java8; import org.junit.Test; import java.util.Optional; import java.uti ...
- Java8 ConcurrentHashMap详解
点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本 ...
- Java8 HashMap详解
文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 ###Java8 HashMap Java8 对 HashMap 进行了一些修改,最大的不同就 ...
- Java8 Stream详解~收集(collect)
collect,收集,可以说是内容最繁多.功能最丰富的部分了.从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合. 1 归集(toList/toSet/toMap) ...
- Java8 Stream详解~归约(reduce)
归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和.求乘积和求最值操作. 「案例一:求Integer集合的元素之和.乘积和最大值.」 public class StreamTest { ...
- Java8 Stream详解~聚合(max/min/count)
max.min.count这些字眼你一定不陌生,没错,在mysql中我们常用它们进行数据统计.Java stream中也引入了这些概念和用法,极大地方便了我们对集合.数组的数据统计工作. 「案例一:获 ...
- Java8 Stream详解~遍历/匹配(foreach/find/match)
Stream也是支持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的.Stream的遍历.匹配非常简单. // import已省略,请自行添加,后面代码亦是publi ...
- Java8 Stream详解~Stream 创建
Stream可以通过集合数组创建. 1.通过 java.util.Collection.stream() 方法用集合创建流 List<String> list = Arrays.asLis ...
最新文章
- TeaTalk 线上直播倒计时 | 云数据库技术创新研究与实践
- 名校 Stanford
- 鸿蒙 github harmony,鸿蒙HarmonyOS之AbilitySlice间导航
- crontab -e 运行python的脚本的坑
- reverseajax(comet) socket 杂记
- ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded
- 第十二届蓝桥杯C++赛后感
- 《软件测试技术实战:设计、工具及管理》—第2章 2.7节测试用例不应该包含实际的数据...
- 掘金mysql_MySQL学习笔记(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
- 数据结构课程设计- (二) 栈与队列(迷宫问题)
- EMC之 “不整改好别回来了”
- RIP、OSPF、ISIS协议的区别
- GNU C Complier - GNU Compiler Collection - GCC
- 3.4.3 区域与图像的平均灰度值
- 云直播丁云鹏:最可怕的,是你低估生活的残酷
- MS-DOC 文件格式概述
- 最新江苏水利水电安全员模拟真题及答案解析
- matlab 工具箱 径向基,精确径向基(matlab工具箱)
- C++ string assign和append的常用方法
- 读《小强升职记》总结
热门文章
- 阿里巴巴Android开发手册V1.0.0随手笔记
- java循环练习:输出1+2+3....+100的和
- linux下定时执行sh
- VS2010下配置 OpenCV2.2
- 51CTO网友感谢信:昨天以940分的成绩顺利通过NE考试 在此特地感谢网工泡泡
- 090717 T OOD时的接口
- Linux数据报文的来龙去脉
- 编码顺序、frame_num和POC
- 用户空间缺页异常pte_handle_fault()分析--(上)
- 数据库程序设计复习资料