1 前言

Optional 是 Java 8 的新特性,专治空指针异常(NullPointerException, 简称 NPE)问题,它是一个容器类,里面只存储一个元素(这点不同于 Conllection)。

为方便用户通过 Lambda 表达式调用 Optional 的方法,部分方法(如:filter、ifPresent、map、orElseGet)需传入函数式接口(如:Predicate、Consumer、Function、Supplier)参数。关于 Lambda 表达式的介绍,详见→Lambda 表达式总结

2 主要属性及构造方法

(1)类定义

Optional 类位于 java.util 包中,类定义如下:

//T 为元素数据类型
public final class Optional<T>

(2)主要属性

//空容器
private static final Optional<?> EMPTY = new Optional<>(); //value 存储容器内唯一元素
private final T value;

(3)构造方法

//无参构造方法:this.value = null
private Optional() //有参构造方法(value不允许为空):this.value = Objects.requireNonNull(value)
private Optional(T value)

3 常用方法

(1)创建容器(empty、of、ofNullable)

//创建空容器:return (Optional<T>) EMPTY
public static<T> Optional<T> empty() //创建容器(value不允许为空):return new Optional<>(value)
public static <T> Optional<T> of(T value) //创建容器(value允许为空):return value == null ? empty() : of(value)
public static <T> Optional<T> ofNullable(T value)

(2)容器判空(isPresent)

//判断容器是否为空:return value != null
public boolean isPresent() //判断容器是否为空,若不为空,消费元素
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}

应用:

Optional<User> op = Optional.of(new User("张三", 20));
op.ifPresent(user -> System.out.println(user));
//op.ifPresent(System.out::println);

(3)获取元素(get、orElse、orElseGet)

//获取容器中唯一元素:return value
public T get() //获取容器唯一元素,若为空,返回指定值:return value != null ? value : other
public T orElse(T other) //获取容器唯一元素,若为空,返回供应者(Supplier)提供的元素
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}

应用:

Optional<User> op = Optional.ofNullable(null);
User user = op.orElseGet(() -> new User("张三", 20));

(4)筛选元素(filter)

//过滤不符合断言(Predicate)的元素
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}

应用:

Optional<User> op = Optional.of(new User("张三", 20));
Optional<User> op2 = op.filter(user -> user.age > 18);

(5)映射元素(map)

//将 T 类型元素映射为 U 类型元素
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<String> op = Optional.of(new String("12345"));
Optional<Integer> op2 = op.map(str -> {
try {
return Integer.parseInt(str);
} catch (Exception e) {
return -1;
}
});

​ 声明:本文转自Optional 详解

Optional 详解的更多相关文章

  1. Swift optional详解

    学习了一阵swift对于optional类型一直不是很了解,为此特意学习了一下,通过观看斯坦福大学的视频,将他所讲的进行了总结 optional 有两个值 1.not set (未设) 代表这个值没有 ...

  2. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  3. (十)Maven依赖详解

    1.何为依赖? 比如你是个男的,你要生孩子,呸呸呸...男的怎么生孩子,所以你得依赖你老婆,不过也不一定咯,你也可以依赖其她妹子. 我们在平时的项目开发中也是同理,你需要依赖一些东西才能实现相应的功能 ...

  4. 史上最全的maven的pom.xml文件详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. quartz配置文件详解

    quartz配置文件详解(转载)     quartz学习总结: 一.关于job:    用Quartz的行话讲,作业是一个执行任务的简单Java类.任务可以是任何Java代码.只需你实现org.qu ...

  6. 【iOS自定义键盘及键盘切换】详解

    [iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...

  7. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  8. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  9. BroadcastReceiver详解

    详解 2014-08-20 19:42 13492人阅读 评论(8) 收藏 举报 分类: 5.andriod开发(148) 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] ...

  10. Markdown语法说明(详解版)

    ####date: 2016-05-26 20:38:58 tags: Markdown tags && Syntax ##Markdown语法说明(详解版)杨帆发表于 2011-11 ...

随机推荐

  1. -- spi flash 擦除接口调用HAL库不同函数的区别

    [描述] 在使用STM32F429操作W25Q128时,为验证flash工作正常,做简单的读写数据校验,在擦除接口中使用 HAL_SPI_Transmit 方法一直工作异常,使用 HAL_SPI_Tr ...

  2. css - 编写 兼容到ie7的导航

    1, index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  3. java - Array 数组反序输出

    通过Array类的静态 sort() 方法可实现对数组排序,sort() 方法提供了许多种重载形式,可对任意类型数组进行升序排序. 然而,Array类中没有类似 js 的 reverse   反序输出 ...

  4. Python Code_04InputFunction

    代码部分 # coding:utf-8 # author : 写bug的盼盼 # development time : 2021/8/28 6:55 present = input('你想要什么?') ...

  5. [转帖]centos6 free 和 centos 7的free 的差异与对比

    目录 一 centos6 free 常用参数和含义 centos6 free 命令示例 free 值讲解 计算公式 二 centos7 free 常用的参数 centos7 free 命令示例 计算公 ...

  6. [转帖]UNIX SOCKET简介

    UNIX Domain SOCKET 是在Socket架构上发展起来的用于同一台主机的进程间通讯(IPC).它不需要经过网络协议栈,不需要打包拆包.计算校验和.维护序列号应答等.只是将应用层数据从一个 ...

  7. [转帖]使用 TiUP 扩容缩容 TiDB 集群

    https://docs.pingcap.com/zh/tidb/stable/scale-tidb-using-tiup TiDB 集群可以在不中断线上服务的情况下进行扩容和缩容. 本文介绍如何使用 ...

  8. 人大金仓学习之二_ksh和kddm的学习

    人大金仓学习之二_ksh和kddm的学习 摘要 承接上一篇文章 主要是这里总结一下ksh相关的文档. 这里学习了很多文档: https://help.kingbase.com.cn/v8/perfor ...

  9. [转帖]【OS】OSWbb(OSWatcher Black Box)的简介和使用

    http://blog.itpub.net/26736162/viewspace-2142613/ OSWatcher Black Box, 简称OSW,是提供的一个小但是非常有用的工具,它通过调用O ...

  10. [转贴]BLOCKED,WAITING,TIMED_WAITING有什么区别?-用生活的例子解释

    BLOCKED,WAITING,TIMED_WAITING有什么区别?-用生活的例子解释 https://www.jianshu.com/p/0976b2f23db1 https://dzone.co ...