Optional解决空指针
Java 8 Optional 类
Java 8 新特性
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
类声明
以下是一个 java.util.Optional<T> 类的声明:
类方法
| 序号 | 方法 & 描述 |
|---|---|
| 1 | static <T> Optional<T> empty()
返回空的 Optional 实例。 |
| 2 | boolean equals(Object obj)
判断其他对象是否等于 Optional。 |
| 3 | Optional<T> filter(Predicate<? super <T> predicate)
如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。 |
| 4 | <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional |
| 5 | T get()
如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException |
| 6 | int hashCode()
返回存在值的哈希码,如果值不存在 返回 0。 |
| 7 | void ifPresent(Consumer<? super T> consumer)
如果值存在则使用该值调用 consumer , 否则不做任何事情。 |
| 8 | boolean isPresent()
如果值存在则方法会返回true,否则返回 false。 |
| 9 | <U>Optional<U> map(Function<? super T,? extends U> mapper)
如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。 |
| 10 | static <T> Optional<T> of(T value)
返回一个指定非null值的Optional。 |
| 11 | static <T> Optional<T> ofNullable(T value)
如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 |
| 12 | T orElse(T other)
如果存在该值,返回值, 否则返回 other。 |
| 13 | T orElseGet(Supplier<? extends T> other)
如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。 |
| 14 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常 |
| 15 | String toString()
返回一个Optional的非空字符串,用来调试 |
注意: 这些方法是从 java.lang.Object 类继承来的。
Optional 实例
我们可以通过以下实例来更好的了解 Optional 类的使用:
import lombok.Data;
import lombok.extern.slf4j.Slf4j; import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; @Slf4j
public class Test {
//任务:获取user中age>18,money>80
public static void main(String[] args) {
User user1 = new User("lisi1", 25, 100);
User user2 = new User("lisi2", 11, 70);
User user3 = new User("lisi4", null, 77);
User user4 = new User("lisi5", 25, null);
User user5 = new User("lisi6", 25, 46);
User user6 = null;
List<User> users = Arrays.asList(user1, user2, user3, user4, user5, user6);
List<User> list = users.parallelStream().filter(user -> {
//user不能为空
// Optional<User> optional = Optional.of(user);
Optional<User> optional = Optional.ofNullable(user);
log.info("do orElse()");
//为空返回orElse中结果,无论是否为空都会执行到
User user10 = optional.orElse(getUser());
log.info("do orElseGet");
// 为空返回orElse中结果,为空都才会执行到
User user11 = optional.orElseGet(Test::getUser);
log.info("do filter");
//filter返回的是Optional
Integer score = optional.filter(s -> s.name.length() > 2).map(User::getMoney).orElse(0);
//不为空执行ifPresent
log.info("do ifPresent");
optional.ifPresent(user12 -> {
log.info("user{}:", user12);
});
if (!optional.isPresent()) {
return false;
}
//获取到的值为空返回else的值
Integer age = optional.map(User::getAge).orElse(0);
Integer money = optional.map(User::getMoney).orElse(0);
return age > 18 && money > 80;
}).collect(Collectors.toList());
log.info("list:{}", list);
} private static User getUser() {
log.debug("Creating New User");
return new User();
} @Data
private static class User {
public User() {
} public User(String name, Integer age, Integer money) {
this.name = name;
this.age = age;
this.money = money;
} String name;
Integer age;
Integer money;
}
}
Optional解决空指针的更多相关文章
- 【原创】JAVA8之妙用Optional解决NPE问题
引言 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user. ...
- Java+Selenium如何解决空指针
1.问题描述:浏览器获取当期窗口值获取为空.
- Jmeter扩展组件开发(9) - 解决空指针问题
问题分析 上一节https://www.cnblogs.com/gltou/p/14967005.html功能描述内容为空,导致Jmeter报空指针 CODE List desc = new Arra ...
- Jdk14都要出了,还不能使用 Optional优雅的处理空指针?
1. 前言 如果你没有处理过空指针,那么你不是一位真正的 Java 程序员. 空指针确实会产生很多问题,我们经常遇到空的引用,然后又想从这个空的引用上去获取其他的值,接着理所当然的碰到了 NullPo ...
- 解决iOS空指针数据的问题
iOS开发中常常会遇到空指针的问题. 如从后台传回来的Json数据,程序中不做推断就直接赋值操作,非常有可能出现崩溃闪退. 为了解决空指针的问题,治标的方法就是遇到一个处理一个.这样业务代码里面就插了 ...
- Java8新特性之五:Optional
NullPointerException相信每个JAVA程序员都不陌生,是JAVA应用程序中最常见的异常.之前,Google Guava项目曾提出用Optional类来包装对象从而解决NullPoin ...
- (八)jdk8学习心得之Optional类
八.Optional 类 1. 作用:可以存放空指针null,主要用于解决空指针问题. 2. 使用方法 1) 创建对象(2种方法) Optional optional = Optional.of(非n ...
- Java 8新特性之 Optional(八恶人-5)
Oswaldo Mobray 莫博瑞·奥斯瓦尔多 “I‘m Oswaldo Mobray, the hangman in these parts.” “我是莫博瑞·奥斯瓦尔多,这片地区的绞刑官.” 一 ...
- Fragment回调顺序及getActivity()为NullPointerException解决方法
Fragment回调顺序 onAttach->onCreate->onCreateView->onActivityCreated ps:最后发现经常在Fragment里面getAct ...
随机推荐
- [翻译]Go与C#对比 第三篇:编译、运行时、类型系统、模块和其它的一切
Go vs C#, Part 3: Compiler, Runtime, Type System, Modules, and Everything Else | by Alex Yakunin | S ...
- Pycharm破解版_安装从失败到成功
前言: 入门学习的时候一直用的是社区版的,现在想换个专业版的玩玩. 本文使用的环境说明: win10系统 安装过pycharm社区版,已卸载 已安装python 3.8.5 (建议看完整篇文章后再自行 ...
- 源代码管理相关命令(Git常用命令、Nuget常用命令、CMD常用命令)
Git常用命令 源代码工具 工具名称 相关地址 Git Git for Windows VSC Visual Studio Code VSC插件(Gitlen) GitLens - Git super ...
- 一QT获取当前时间和日期
获取日期和时间使用QDateTime类,该类中有一个静态成员函数可以返回当前的时间信息 我们可以直接调用这个静态函数获取当前时间 QDateTime time = QDateTime::current ...
- 100、nginx_https安全链接配置
100.1. tcp的三次握手和四次挥手的过程: 1.三次握手(建立连接): 第一次:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次:服务器 ...
- css 背景图片铺满
body { width: 100%; height: 100%; background: url(img/loginbg.png); background-size: 100% 100%; back ...
- [心得]安装MongoDB
1. 安装 (1) 其他默认 (2) 创建文件 在 E:\DevTools\MongoDB\Server\3.4 1 1 E:\DevTools\MongoDB\Server\3.4 下创建dat ...
- Linux之 du的用法
du 显示目录和文件的大小,常用命令为 du -sh * du -sm * | sort -n //统计当前目录大小 并按大小 排序 du 无参数 显示当前路径下的目录大小和子目录大小 -b/-k/- ...
- python中的内置函数lambda map filter reduce
p.p1 { margin: 0; font: 12px "Helvetica Neue" } p.p2 { margin: 0; font: 12px "Helveti ...
- jenkins报错: error: insufficient permission for adding an object to repository database .git/objects
前言:这是在用jenkins去gitlab上面去拉下代码来编译,就报了这个错,在这里记录下,避免下次 报错: 17:08:17 error: insufficient permission for ...