引言

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类相关推荐

  1. JDK8新特性-Optional类

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 JDK8新特性-Option ...

  2. Java JDK8新特性Optional类

    Optional类 1.该类java.util包下,是不能被继承的泛型类即:public final class Optional<T>. 2.该类有两个私有属性: T value和 静态 ...

  3. Java8新特性——Optional 类

    文章目录 前言 Optional 类 1.概述 2.API介绍 of ofNullable empty isPresent get ifPresent orElse orElseGet orElseT ...

  4. Java8新特性 Optional类

    作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了.这篇文章我们来学习Java8是如何通过 ...

  5. Java8新特性Optional类

    这里写自定义目录标题 Java8 Optional 类 前言 创建 Optional 实例 Optional API常用接口的用法 get()方法 isPresent()方法 isPresent()方 ...

  6. java 8 optional 类,Java8新特性-Optional类

    Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指 ...

  7. Java8新特性-Optional类

    概念:Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这 ...

  8. Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测

  9. JDK8 新特性流式数据处理

    在学习JDK8新特性Optional类的时候,提到对于Optional的两个操作映射和过滤设计到JDK提供的流式出来.这篇文章便详细的介绍流式处理: 一. 流式处理简介 流式处理给开发者的第一感觉就是 ...

最新文章

  1. 安卓系统底层C语言算法之测试参数是几个long型的算法
  2. java 执行javascript_说说如何在 Java 中执行 JavaScript 脚本
  3. python的excel库_Python-excel相关库
  4. VS2008 error PRJ0002 : 错误的结果 31 (从“C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\rc.exe”返回)。...
  5. 北斗导航 | GPS卫星导航技术重要人物简介
  6. 基于图像的三维重建与基于三维点云数据的曲面拟合
  7. 验证服务器的通用性,通用VNFM部署的可行性分析与验证
  8. 自适应的设置字体的方式
  9. OSM地图本地发布-如何生成各省市矢量地图
  10. qq邮箱怎么qq找不到服务器,qq邮箱登录手机版网页 求高手 QQ邮箱登不上去 显示找不到服务器15?请问我咋用不...
  11. 计网 应用题、计算题 答案详解 总结(已更完)
  12. Windows2000 内核级进程隐藏、侦测技术[毕业论文]
  13. snipaste滚动截图方法_如何在电脑上截图?教你3种常用的截图方法,利用快捷键效果最快...
  14. vue实现查询组件的封装
  15. 51_LCD1602 - DS1302可调时钟
  16. bhu1272小希的迷宫
  17. Android 定位的实现
  18. 【第一章 | 操作系统概述】《操作系统 慕课版》课后答案 + 复习
  19. 电梯视频监控,安防工作中不可缺少的一环
  20. “一体三面”打造智慧城市建设的平顶山模式

热门文章

  1. 解系统禁用了usb服务器,知识科普:USB端口如何禁用和解锁?
  2. Matlab(R2014a版本)一阶、二阶系统响应
  3. 解放号占楼送大礼活动新浪微博火热进行中
  4. XXE知识总结,有这篇就够了!
  5. Python实现直播答题
  6. PCB设计笔记-AD(四)-AD PCB 根据板外形铺铜 异形板自动铺铜
  7. java flatmap使用,rxjava2.0第三篇之flatMap使用
  8. 神机百炼2.44-点的层次BFS
  9. python 输入纯数字
  10. 韩国通过灰姑娘法 凌晨后青少年网游将强制断网