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. 宝塔部署 springboot 项目遇到的 一些bug处理方案

    1,上传的项目(jar包)的数据库用户名 .密码 , 和服务器的数据库用户名.密码不一致 2,数据库的表结构没有创建 3, 宝塔 phpmyadmin 进不去 原因: 服务器没有放行888端口, 宝塔 ...

  2. js - 使用 scroll属性手撸轮播图 —— 无缝连接,更丝滑

    上效果图: 上代码: <!DOCTYPE html> <html lang="en"> <head>     <meta charset= ...

  3. [转帖]MySQL的版本情况

    Introducing MySQL Innovation and Long-Term Support (LTS) versions (oracle.com) Introducing MySQL Inn ...

  4. [转帖]RHEL/CentOS 7中的网络暨network.service与NetworkManager.service详解

    在RHEL/CentOS 6及以前的版本中,网络功能是通过一系列网络相关的脚本文件实现,如/etc/init.d/network文件,及如下/sbin/if*文件等. [root@myserver ~ ...

  5. [转帖]分析redis 大key

    http://www.lishuai.fun/2023/05/05/redis-bigkey/#/%E5%AE%89%E8%A3%85 redis-rdb-tools 是一个 python 的解析 r ...

  6. [转帖]人人都应该知道的CPU缓存运行效率

    https://zhuanlan.zhihu.com/p/628017496 提到CPU性能,大部分同学想到的都是CPU利用率,这个指标确实应该首先被关注.但是除了利用率之外,还有很容易被人忽视的指标 ...

  7. [转帖]疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高?

    疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高? 因为存在CPU上下文切换. linux系统说明 Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行.当然,这些 ...

  8. 树状数组(区间修改&&区间查询)

    #include<bits/stdc++.h> #define int long long using namespace std; int n,m,x,x1,y,z; int a[100 ...

  9. Spring源码——初识Spring容器

    Spring源码之工厂(容器) 为什么把Spring的工厂又叫做容器呢? 工厂的责任是创建对象,但是创建完对象后还要进行存储(针对于单例的对象来讲),以供其他地方使用,这就是容器.为了能存多个对象,并 ...

  10. 【8】python_matplotlib改变横坐标和纵坐标上的刻度(ticks)、sagemath-list_plot()调整图例(legend)中点的数量、Matplotlib画各种论文图

    1.python_matplotlib改变横坐标和纵坐标上的刻度(ticks) 用matplotlib画二维图像时,默认情况下的横坐标和纵坐标显示的值有时达不到自己的需求,需要借助xticks()和y ...