个人网站:http://xiaocaoshare.com/

要求:jdk1.8以上

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象

常用方法:

1.of方法

为非null的值创建一个Optional,如果值为空则抛出一个空指针异常

public static <T> Optional<T> of(T value) {return new Optional<>(value);
}
private Optional(T value) {this.value = Objects.requireNonNull(value);
}
public static <T> T requireNonNull(T obj) {if (obj == null)throw new NullPointerException();return obj;
}

2.ofNullable方法

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional

public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}

3.isPresent方法

如果值存在返回true,否则返回false。

public boolean isPresent() {return value != null;
}

4.get方法

如果Optional有值则将其返回,否则抛出NoSuchElementException。

public T get() {if (value == null) {throw new NoSuchElementException("No value present");}return value;
}

5.ifPresent

如果Optional实例有值则为其调用consumer,否则不做处理

public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value);
}

6.orElse

如果有值则将其返回,否则返回指定的其它值。

public T orElse(T other) {return value != null ? value : other;
}

7.orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值

public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get();
}

8.orElseThrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {if (value != null) {return value;} else {throw exceptionSupplier.get();}
}

9.map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。

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));}
}

10.flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。

flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional

public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Objects.requireNonNull(mapper.apply(value));}
}

11.filter

如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional

public Optional<T> filter(Predicate<? super T> predicate) {Objects.requireNonNull(predicate);if (!isPresent())return this;elsereturn predicate.test(value) ? this : empty();
}

常用写法:

1.

Coupon coupon = couponService.getCoupon(id);
Optional.ofNullable(coupon).filter(o -> o.getValid()).filter(o -> programToken.equals(o.getProgramToken())).orElseThrow(() -> new MiniException(ErrCode.COUPON_NOT_EXISTS.getName()));

根据Id查询对象,判断对象是否存在(valid为1表示数据有效,0表示已删除,token代表某个商家)

Java Optional类源码解析和用法相关推荐

  1. Java String类源码解析

    String直接继承Object 含有一个char[] value,还有一个int hash默认值为0 new String()的构造产生的是一个值为""的字符数组 String( ...

  2. Java LinkedHashMap类源码解析

    摘要: LinkedHashMap继承了HashMap,他在HashMap的基础上增加了一个双向链表的结构,链表默认维持key插入的顺序,重复的key值插入不会改变顺序,适用于使用者需要返回一个顺序相 ...

  3. java.lang 源码剖析_java.lang.Void类源码解析

    在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code ...

  4. Java String类源码阅读笔记

    文章目录 一.前置 二.String类源码解析 1.String类继承关系 2.成员变量 3.构造方法 4.长度/判空 5.取字符 6.比较 7.包含 8.hashCode 9.查询索引 10.获取子 ...

  5. Java集合---LinkedList源码解析

    一.源码解析 1. LinkedList类定义 2.LinkedList数据结构原理 3.私有属性 4.构造方法 5.元素添加add()及原理 6.删除数据remove() 7.数据获取get() 8 ...

  6. Java线程池源码解析及高质量代码案例

    引言 本文为Java高级编程中的一些知识总结,其中第一章对Jdk 1.7.0_25中的多线程架构中的线程池ThreadPoolExecutor源码进行架构原理介绍以及源码解析.第二章则分析了几个违反J ...

  7. Java集合-ArrayList源码解析-JDK1.8

    ◆ ArrayList简介 ◆ ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAcc ...

  8. Node 学习六、核心模块 events之 01 events 和 EventEmitter 类、发布订阅、EventEmitter 类源码解析和模拟实现

    events 事件模块 events 与 EventEmitter node.js 是基于事件驱动的异步操作架构,内置 events 模块 events 模块提供了 EventEmitter 类 这个 ...

  9. Scroller类源码解析及其应用(一)

    滑动是我们在自定义控件时候经常遇见的难题,让新手们倍感困惑,这篇文章主要介绍Scroller类的源码,告诉打击这个到底有什么用,怎么使用它来控制滑动.另外,我还会结合一个简单的例子,来看一下这个类的应 ...

最新文章

  1. 微软和谷歌分别开源分布式深度学习框架,各自厉害在哪?
  2. 给ModalPopupExtender控件添加弹出关闭等事件
  3. python中类的嵌套_python中的嵌套类 | 学步园
  4. 百练OJ:3681与2796:数字求和
  5. DevExpress的分页Tab控件XtraTabControl控件的使用
  6. html table导出excel 插入图片_前端 Table 用 JS 导出EXCEL(支持大量数据,保留报表格式) - pensive2019...
  7. cls_template.php on line 1072,博客 – 联发多彩网页技术博客
  8. Python 并行编程
  9. 外设驱动库开发笔记13:MLX90614红外温度传感器驱动
  10. 实验四_078_刘玲志
  11. 编译OpenJDK12:LNK2019 无法解析的外部符号sprintf
  12. Android Realm(数据库)
  13. win10桌面管理文件收纳_处女座福音 整理Win10桌面图标新玩法
  14. 捷联惯导系统学习7.2(捷联惯导精对准 )
  15. mysql 修改max_allowed_packet_Mysql修改max_allowed_packet参数
  16. camisetas de futbol baratas carrera
  17. 信号完整性(SI)电源完整性(PI)学习笔记(十四)有损线、上升边退化与材料特性(一)
  18. Excel使用---excel2016___一般操作(搬,侵删)
  19. poj 1608 dp(Banal Ticket)
  20. Python中os.listdir的排序问题

热门文章

  1. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅
  2. 组策略 从入门到精通(十)通过组策略进行软件分发和卸载
  3. exchange 2010 search mailbox 的幕后强大功能
  4. ORA-19809: 超出了恢复文件数的限制
  5. python twisted 笔记
  6. static和global的区别
  7. 解决.net webservice的WebClient或HttpWebRequest首次连接缓慢问题
  8. HDU-1203 I NEED A OFFER!-0、1背包及空间优化
  9. Tech.Ed2005 讲义下载地址
  10. android native java_在Android Native层中创建Java虚拟机实例