JDK8新特性 - Optional类
引言
Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
类声明
以下是一个 java.util.Optional 类的声明:
public final class Optional<T>
extends Object
序号 | 方法 & 描述 |
---|---|
1 |
static Optional empty() 返回空的 Optional 实例。 |
2 |
boolean equals(Object obj) 判断其他对象是否等于 Optional。 |
3 |
Optional filter(Predicate<? super predicate) 如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。 |
4 |
Optional flatMap(Function<? super T,Optional> 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 |
Optional map(Function<? super T,? extends U> mapper) 如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。 |
10 |
static Optional of(T value) 返回一个指定非null值的Optional。 |
11 |
static Optional ofNullable(T value) 如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 |
12 |
T orElse(T other) 如果存在该值,返回值, 否则返回 other。 |
13 |
T orElseGet(Supplier<? extends T> other) 如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。 |
14 |
T orElseThrow(Supplier<? extends X> exceptionSupplier) 如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常 |
15 |
String toString() 返回一个Optional的非空字符串,用来调试 |
of && ofNullable
public static <T> Optional<T> of(T value) {return new Optional<>(value);
}public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}
根据上面源码, of 对null对象没有做任何处理,ofNullable才做了处理。所以当我们不知道传入的对象是否为null的时候,我们应该选择用 ofNullable来做处理。
map
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Optional.ofNullable(mapper.apply(value));}
}
Optional 实例如果我们想获取Object里面的值的话,我们就需要用到这个map。
我们可以通过以下实例来更好的了解 Optional 类的使用:
public class OptionalTest {public static void main(String[] args) {TestVo vo=new TestVo();vo.setName("我是测试");Optional<TestVo> opt=Optional.ofNullable(vo);String name=opt.map(v-> v.getName()).get();System.out.println("Name是:"+name);Optional<TestVo> opt2=Optional.ofNullable(null);String name2=opt2.map(v-> v.getName()).orElse("我是null");System.out.println("Name2是:"+name2);Integer value1 = null;Integer value2 = new Integer(10);// Optional.ofNullable - 允许传递为 null 参数Optional<Integer> optional1= Optional.ofNullable(value1);//Optional.of - 如果传递的参数是 null,抛出异常 NullPointerExceptionOptional<Integer> optional2= Optional.of(value2);System.out.println(sum(optional1,optional2));}/*** 两个数相加* @return*/public static Integer sum(Optional<Integer> a,Optional<Integer> b) {// Optional.isPresent - 判断值是否存在System.out.println("第一个参数值存在: " + a.isPresent());System.out.println("第二个参数值存在: " + b.isPresent());Integer value1=a.orElse(0);Integer value2=b.orElse(0);return value1+value2;}
}
运行输出结果是:
Name是:我是测试
Name2是:我是null
第一个参数值存在: false
第二个参数值存在: true
两个数和:10
JDK8新特性 - Optional类相关推荐
- JDK8新特性-Optional类
个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 JDK8新特性-Option ...
- Java JDK8新特性Optional类
Optional类 1.该类java.util包下,是不能被继承的泛型类即:public final class Optional<T>. 2.该类有两个私有属性: T value和 静态 ...
- Java8新特性——Optional 类
文章目录 前言 Optional 类 1.概述 2.API介绍 of ofNullable empty isPresent get ifPresent orElse orElseGet orElseT ...
- Java8新特性 Optional类
作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了.这篇文章我们来学习Java8是如何通过 ...
- Java8新特性Optional类
这里写自定义目录标题 Java8 Optional 类 前言 创建 Optional 实例 Optional API常用接口的用法 get()方法 isPresent()方法 isPresent()方 ...
- java 8 optional 类,Java8新特性-Optional类
Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指 ...
- Java8新特性-Optional类
概念:Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这 ...
- Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测
- JDK8 新特性流式数据处理
在学习JDK8新特性Optional类的时候,提到对于Optional的两个操作映射和过滤设计到JDK提供的流式出来.这篇文章便详细的介绍流式处理: 一. 流式处理简介 流式处理给开发者的第一感觉就是 ...
最新文章
- 安卓系统底层C语言算法之测试参数是几个long型的算法
- java 执行javascript_说说如何在 Java 中执行 JavaScript 脚本
- python的excel库_Python-excel相关库
- VS2008 error PRJ0002 : 错误的结果 31 (从“C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\rc.exe”返回)。...
- 北斗导航 | GPS卫星导航技术重要人物简介
- 基于图像的三维重建与基于三维点云数据的曲面拟合
- 验证服务器的通用性,通用VNFM部署的可行性分析与验证
- 自适应的设置字体的方式
- OSM地图本地发布-如何生成各省市矢量地图
- qq邮箱怎么qq找不到服务器,qq邮箱登录手机版网页 求高手 QQ邮箱登不上去 显示找不到服务器15?请问我咋用不...
- 计网 应用题、计算题 答案详解 总结(已更完)
- Windows2000 内核级进程隐藏、侦测技术[毕业论文]
- snipaste滚动截图方法_如何在电脑上截图?教你3种常用的截图方法,利用快捷键效果最快...
- vue实现查询组件的封装
- 51_LCD1602 - DS1302可调时钟
- bhu1272小希的迷宫
- Android 定位的实现
- 【第一章 | 操作系统概述】《操作系统 慕课版》课后答案 + 复习
- 电梯视频监控,安防工作中不可缺少的一环
- “一体三面”打造智慧城市建设的平顶山模式