Java 8 Optional 的用法
认识Optional
Optionals是用于防止 NullPointerException 的漂亮工具。让我们快速了解一下Optionals的工作原理。
Optional 是一个简单的容器,其值可能是null或者不是null。在Java 8之前一般某个函数应该返回非空对象但是有时却什么也没有返回,而在Java 8中,你应该返回 Optional 而不是 null。
可以大概瞥一眼官方文档:https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
先看几个传统if判空用法:
public static String getName(User u) {
    if (u == null || u.name == null)
        return "Unknown";
    return u.name;
}
public static String getChampionName(Competition comp) throws IllegalArgumentException {
    if (comp != null) {
        CompResult result = comp.getResult();
        if (result != null) {
            User champion = result.getChampion();
            if (champion != null) {
                return champion.getName();
            }
        }
    }
    throw new IllegalArgumentException("The value of param comp isn't available.");
}
Optional改写:
public static String getName(User u) {
    return Optional.ofNullable(u)
                    .map(user->user.name)
                    .orElse("Unknown");
}
public static String getChampionName(Competition comp) throws IllegalArgumentException {
    return Optional.ofNullable(comp)
            .map(c->c.getResult())
            .map(r->r.getChampion())
            .map(u->u.getName())
            .orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}
是不是看着很简洁舒服,可读性也提高了一个档次。
核心常用方法介绍:
如何生成一个Optenal对象?
Optional<String> s2 = Optional.ofNullable(s);// Returns anOptionaldescribing the specified value, if non-null, otherwise returns an emptyOptional. Optional<Object> empty = Optional.empty();//Returns an emptyOptionalinstance.
//of():为非null的值创建一个Optional
Optional<String> optional = Optional.of("bam");
// isPresent(): 如果值存在返回true,否则返回false
optional.isPresent(); // true
//get():如果Optional有值则将其返回,否则抛出NoSuchElementException
optional.get(); // "bam"
//orElse():如果有值则将其返回,否则返回指定的其它值
optional.orElse("fallback"); // "bam"
//ifPresent():如果Optional实例有值则为其调用consumer,否则不做处理
optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b"
一般使用Optional.ofNullable(s) 即可 ,返回一个不确定的Optional。
map () 映射出一个对象放入Optional容器。
 Optional<String> s = Optional.ofNullable(Arrays.asList("1,2,3".split(",")))
                .map(li -> li.get(0));
String s3 = Optional.ofNullable(Arrays.asList("1,2,3".split(",")))
        .map(li -> li.get(0))
        .orElse("4");
.filter()过滤出符合条件的
List<String> list==Optional.ofNullable(Arrays.asList("1,2,3".split(","))) .filter(str->str.equals("2")).orElseThrow(()->new IllegalArgumentException("IllegalArgument"));
Optional.filter() 可以用于参数校验 如:
public void setName(String name) throws IllegalArgumentException {
    this.name = Optional.ofNullable(name).filter(User::isNameValid)
                        .orElseThrow(()->new IllegalArgumentException("Invalid username."));
}
Optional就像一个处理不确定性的管道,我们在一头丢进一个可能是null的东西(接口返回结果),经过层层处理,最后消除不确定性。Optional在过程中保留了不确定性,从而把对null的处理移到了若干次操作的最后,以减少出现NPE错误的可能。
于是,Optional应用的建议也呼之欲出了:
- 适用于层级处理(依赖上一步操作)的场合。
- 产生对象的方法若可能返回null,可以用Optional包装。
- 尽可能延后处理null的时机,在过程中使用Optional保留不确定性。
- 尽量避免使用Optional作为字段类型。
这种依赖上一步的操作也叫Continuation。而Optional的这种接受并组合多个Continuation的设计风格就是Continuation-passing style(CPS)。
Java 8 Optional 的用法的更多相关文章
- Java 8 Optional 类深度解析
		Java 8 Optional 类深度解析 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只 ... 
- Java 8 Optional类使用的实践经验
		前言 Java中空指针异常(NPE)一直是令开发者头疼的问题.Java 8引入了一个新的Optional类,使用该类可以尽可能地防止出现空指针异常. Optional 类是一个可以为null的容器对象 ... 
- java.util.Optional学习笔记
		java.util.Optional是Java 8新增的类,作为一个持有实例的容器类,可以帮我们把判空的代码写得更优雅,并且该类还提供了一些实用的api,官方文档在这里,接下来我们通过实战来学习吧: ... 
- Java 8 Optional:优雅地避免 NPE
		本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查.在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的. 空指针异常(NullPo ... 
- Java 8 Optional 良心指南,建议收藏
		想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案.作为一名 Java 程序员,我真的是烦透了 Null ... 
- Java9系列第7篇:Java.util.Optional优化与增强
		我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ... 
- JAVA 8 Optional类介绍及其源码
		什么是Optional对象 Java 8中所谓的Optional对象,即一个容器对象,该对象可以包含一个null或非null值.如果该值不为null,则调用isPresent()方法将返回true,且 ... 
- java中this的用法?
		2008-07-28 08:10cztx5479 | 分类:JAVA相关 | 浏览4533次 java中this的用法? import java.awt.*; import java.awt.even ... 
- 转:十八、java中this的用法
		http://blog.csdn.net/liujun13579/article/details/7732443 我知道很多朋友都和我一样:在JAVA程序中似乎经常见到“this”,自己也偶尔用到它, ... 
随机推荐
- js实现文字上下滚动效果
			大家都知道,做html页面时,为了提升网页的用户体验,我们需要在网页中加入一些特效,比如单行区域文字上下滚动就是经常用到的特效.如下图示效果: <html> <head> &l ... 
- [Algorithm] BFS vs DFS
			//If you know a solution is not far from the root of the tree: BFS, because it is faster to get clos ... 
- BZOJ 4477: [Jsoi2015]字符串树 可持久化trie树
			这个是真——可持久化字典树..... code: #include <bits/stdc++.h> #define N 100006 #define setIO(s) freopen(s& ... 
- 后台增删改查的实现——java基础、jsp、servlet、数据库
			1.前台和后台的关系: 后台是由工作人员操作的,通过后台系统对数据库实行增删改查等操作,通过前台系统访问数据库,将数据库中的信息通过前台显示. 2.功能实现: (1)显示全部商品信息: home.js ... 
- [RN] React Native 查看console打印出来的内容
			我们在调试React Native 程序的时候,经常会用到Js的打印语句Console.log等 但我们一脸蒙逼的时候,启动的时候完全看不到打印的内容在哪儿呢??? 原来还要在命令行下输入一个语句才能 ... 
- ThinkPad T410i 2516A21 升級手札(換SSD固態硬碟、I7 CPU、開機20秒)
			最近筆記本越來越慢,開機得20分鐘,而且CPU動不動就飆到80度,趁著開學網上活動,準備給老伙計來一次重大升級.查一下主板芯片,最高支持8G內存,已經滿了,光驅位加了一個1T機械硬盤,那麼能升級的就只 ... 
- Linux下查看目录文件数和文件大小
			一.查看当前目录下文件个数 在linux下查看目录下有多少文件可以用:ls -l 命令查看,ls -lR 递归查看所有目录, 如果文件很多,则用wc命令 和 grep 命令进行过滤. wc命令显示输 ... 
- 论文解读:3D Hand Shape and Pose Estimation from a Singl RGB Image
			本文链接:https://blog.csdn.net/williamyi96/article/details/89207640由于最近做到了一些 3D Hand Pose Estimation 相关的 ... 
- 迁移Git项目到Gitlab
			假定Gitlab已经安装, 假定要迁移的Git项目目录为 demo 首先在Gitlab里创建一个新的project, 名称为demo (或者其他名称都可以) 然后在现有的Git项目目录下, 进行以下操 ... 
- USB安装ESXi出错,menu.c32 not a com32r image
			USB安装EXSi出错,menu.c32 not a com32r image 不能进入安装界面. 提供提取的menu.c32 下载下来覆盖U盘根目录源文件 EXSi6.7测试可以用 文件csdn下载 ... 
