千家信息网

java8新特性之Optional的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了java8新特性之Optional的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文以jdk1.8.0_1
千家信息网最后更新 2026年11月02日java8新特性之Optional的示例分析

这篇文章主要介绍了java8新特性之Optional的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

本文以jdk1.8.0_111源码为例

public final class Optional {}

Optional是一个为了解决NullPointerException设计而生可以包含对象也可以包含空的容器对象。封装了很多对空处理的方法也增加了filter、map这样的检索利器,其中函数式编程会有种炫酷到爆的感觉。

基础测试用例对象:

public class Java8OptionalTest { List stringList = null; ICar car = new WeiLaiCar();}public class WeiLaiCar implements ICar { Integer wheels = new Integer(4);}

Api中提供的4种optional

最核心的当属Optional对象,泛型的引入支持了所有对象类型,又增加对常用场景下的dubbo\int\long进行扩展。重点介绍一下Optional对象的方法其他三个类似。

  • public final class Optional {

  • public final class OptionalDouble {

  • public final class OptionalInt {

  • public final class OptionalLong {

@FunctionalInterface
Predicate\Consumer\Supplier三个接口都是函数式接口

静态方法of

private Optional() { this.value = null;}

构造方法被private,不能new但提供了of这样的静态方法去初始化类;

public static  Optional of(T value) { return new Optional<>(value);}public static  Optional ofNullable(T value) { return value == null ? empty() : of(value);}public static Optional empty() { @SuppressWarnings("unchecked") Optional t = (Optional) EMPTY; return t;}

1、empty支持你去创建一个空的optional类,这样的类直接get()会报错:java.util.NoSuchElementException: No value present

2、of(x)传入的对象不能为null,而ofNullable(x)是支持传入null的对象,一般用这两个比较多。

present 方法

isPresent是用来判断optional中对象是否为null,ifPresent的参数是当对象不为null时执行的lamdba表达式。

public boolean isPresent() { return value != null;}public void ifPresent(Consumer consumer) { if (value != null) consumer.accept(value);}

示例详解介绍了ifPresent特性:

Java8OptionalTest test = new Java8OptionalTest();Optional optional = Optional.of(test);pringTest(optional.isPresent());//trueoptional.ifPresent( a -> pringTest(a.getCar().getClass().getName()));//com.ts.util.optional.WeiLaiCaroptional.ifPresent( a -> Optional.ofNullable(a.getStringList()).ifPresent(b -> pringTest("StringList:" + (b == null))));//第一级的ifPresent是存在test对象,所以执行了lambda表达式,而第二级的ifPresent的stringList是null,所以没有执行表达式optional.ifPresent( a -> Optional.ofNullable(a.getCar()).ifPresent(b -> pringTest("car:" + (b == null))));//car:false//第二级ifPresent的car对象是存在的,所以第二级的表达式执行了

map 方法

源码提供了两种map和flatMap。

  • map方法的参数是个当包含的对象不为null时才执行的lambda表达式,返回该表达式执行结果的封装optional对象,同理支持链式调用,逐层深入和递归递进很像;

  • flatMap区别在于lambda表达式的返回结果必须主动包裹Optinoal,否则报错

public Optional map(Function mapper) { Objects.requireNonNull(mapper); if (!isPresent())  return empty(); else {  return Optional.ofNullable(mapper.apply(value)); }}public Optional flatMap(Function> mapper) { Objects.requireNonNull(mapper); if (!isPresent())  return empty(); else {  return Objects.requireNonNull(mapper.apply(value)); }}

测试示例:

Java8OptionalTest test = new Java8OptionalTest();Optional optional = Optional.of(test);Optional opt1 = optional.map( a -> a.getCar());pringTest(opt1.get());//com.ts.util.optional.WeiLaiCar@5d6f64b1int wheel = 0;//传统null判断写法if(test != null){ if(test.getCar() != null){//实际业务里面层级也许会超过3层  wheel = test.getCar().getWheelCount(); }}pringTest("传统:"+wheel);//传统:4Optional opt2 = optional.map( a -> a.getCar()).map(b -> b.getWheelCount());//Optional支持下的写法pringTest("optinal:"+opt2.get());//optinal:4Optional opt3 = optional.map( a -> a.getStringList()).map(b -> b.size());pringTest(opt3);//Optional.emptyOptional opt4 = optional.flatMap(a -> Optional.of(a.getCar()));//主动包裹Optional对象pringTest(opt4);//Optional[com.ts.util.optional.WeiLaiCar@5d6f64b1]Optional opt5 = optional.flatMap(a -> Optional.of(a.getCar())).flatMap(b -> Optional.ofNullable(b.getWheelCount()));pringTest(opt5);//Optional[4]

filter 方法

源码如下:

public Optional filter(Predicate predicate) { Objects.requireNonNull(predicate); if (!isPresent())  return this; else  return predicate.test(value) ? this : empty();}

filter方法传入一个断言语句条件的lambda表达式,返回一个原对象的optional包装,所以支持链式调用;只要记住这三点你便掌握如何使用了。

看下面的例子:

Java8OptionalTest test = new Java8OptionalTest();Optional optional = Optional.of(test);Optional result = optional.filter( a -> a.getCar() != null).filter( b -> b.getClass().getName() != null);pringTest(result.isPresent()? result.get().getClass().getName(): result.isPresent());//com.ts.util.Java8OptionalTestOptional result1 = optional.filter( a -> a.getStringList() != null);pringTest(result1.get());//java.util.NoSuchElementException: No value present

orElse 方法

Api提供了三个方法。

  • orElse 当optional内对象为null就返回这个参数,比较像很多默认值设置;

  • orElseGet 基本同orElse,区别是传入参数支持lambda表达式,返回的就是表达式执行结果;

  • orElseThrow 也是传入lambda表达式,但是表达式是抛出异常

public T orElse(T other) { return value != null ? value : other;}public T orElseGet(Supplier other) { return value != null ? value : other.get();}public  T orElseThrow(Supplier exceptionSupplier) throws X { if (value != null) {  return value; } else {  throw exceptionSupplier.get(); }}

测试用例如下:

Java8OptionalTest one = null;Java8OptionalTest test = new Java8OptionalTest();Optional optional = Optional.ofNullable(one);pringTest(optional);//Optional.emptypringTest(optional.orElse(test));//com.ts.util.Java8OptionalTest@5197848cpringTest(optional.orElseGet(() -> new Java8OptionalTest()));//com.ts.util.Java8OptionalTest@5d6f64b1pringTest(optional.orElseThrow(() -> new RuntimeException("orElseThrow")));//java.lang.RuntimeException: orElseThrow

感谢你能够认真阅读完这篇文章,希望小编分享的"java8新特性之Optional的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

对象 方法 表达式 支持 示例 参数 篇文章 特性 三个 传统 源码 结果 测试 分析 主动 写法 函数 包裹 接口 静态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技会 科技信息互联网 金融科技与互联网金融 易通互联网络科技有限公司 唐信互联网科技 大连 互联网养老 桔豆科技 欧洲十大科技互联网公司 互联网科技有哪些公司 互联网为啥属于高科技 赶超互联网科技 微信多开 链环科技传统企业怎么转型互联网 畅思互联网科技 互联网科技和法律行业 有人说阿里系是互联网科技企业 西安有哪些互联网高科技企业 全球科技与互联网公司市值变化 版纳互联网科技选哪家 银川新华互联网科技学校是国营吗 互联网科技职业技能培训学校 深圳互联网科技园地址 北京路客互联网科技有限公司 互联网巨头反垄断金融科技 与互联网科技公司 互联网 视角下的科技创新 互联网科技公司的市场部门 江苏南京365互联网科技 互联网科技研发水平 山东星卡互联网科技有限公司官网 互联网科技机房 互联网科技创新创业项目
0