一、API介绍

of()

功能:创建Optional实例
注意:创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。

    public static void of() {// 创建Optional实例:参数非nullOptional<String> notNullOptional = Optional.of("xiaoxian");// 创建Optional实例:参数为null,抛出 NullPointerExceptiontry {Optional<String> nullOptional = Optional.of(null);} catch (NullPointerException e) {// 输出:nullSystem.out.println("【of()】" + e.getMessage());// 输出:java.lang.NullPointerExceptione.printStackTrace();}}

ofNullable()

功能:创建Optional实例
注意:如果指定的值为null,则返回一个空的Optional。

    public static void ofNullable() {// ofNullable()与of()相似,区别在于:ofNullable()是可以接受参数为null的情况。// 创建Optional实例:参数非nullOptional<String> notNullOptional = Optional.ofNullable("xiaoxian");// 创建Optional实例:参数为null,不会报错,返回一个空的Optional实例Optional<String> nullOptional = Optional.ofNullable(null);}

empty()

功能:创建空的Optional实例

    public static void empty() {// 创建空的Optional实例Optional<String> emptyOptional = Optional.empty();}

get()

功能:获取Optional实例值
注意:如果实例值非null,就返回实例值,否则抛出NoSuchElementException

    public static void get() {// 获取Optional实例值,如果实例值非null,就返回实例值,否则抛出NoSuchElementException// 输出:xiaoxianSystem.out.println("【get()】" + notNullOptional.get());try {//如果Optional实例值为空,抛出 NoSuchElementException// 输出:No value presentSystem.out.println("【get()】" + nullOptional.get());} catch (NoSuchElementException e) {// 输出:java.util.NoSuchElementExceptione.printStackTrace();}}

isPresent()

功能:检查Optional实例是否包含值。如果值存在返回true,否则返回false

    public static void isPresent() {//检查Optional实例是否包含值:如果值存在返回true,否则返回false// 输出:trueSystem.out.println("【isPresent()】" + notNullOptional.isPresent());// 输出:falseSystem.out.println("【isPresent()】" + nullOptional.isPresent());}

ifPresent()

功能:检查Optional实例是否有值,如果实例值非null,就执行lambda表达式,否则不处理

    public static void ifPresent() {//检查Optional实例是否有值,如果实例值非null,就执行lambda表达式,否则不处理notNullOptional.ifPresent(s -> {s = s + " love java";// 输出:xiaoxian love javaSystem.out.println("【ifPresent()】" + s);});// 通过ifPresent修改的值,再次通过get获取的时候不会改变// 输出:xiaoxianSystem.out.println("【ifPresent()】" + notNullOptional.get());}

orElse()

功能:检查Optional实例是否有值,如果实例非null,就返回实例值,否则返回指定的其它值。

    public static void orElse() {//如果Optional实例值非null,返回Optional的值// 输出:xiaoxianSystem.out.println("【orElse()】" + notNullOptional.orElse("There is no value present!"));//如果Optional实例值为null,返回传入的值// 输出:xiaoxian 666System.out.println("【orElse()】" + nullOptional.orElse("xiaoxian 666"));}

orElseGet()

功能:检查Optional实例是否有值,如果实例值非null,就返回实例值,否则返回lambda表达式的值。

    public static void orElseGet() {// orElseGet与orElse方法类似// 区别在于:orElse传入的是默认值,orElseGet可以接收一个lambda表达式生成默认值//如果Optional实例值非null,返回Optional的值// 输出:xiaoxianSystem.out.println("【orElseGet()】" + notNullOptional.orElseGet(() -> "Default Value"));//如果Optional实例值为null,返回lambda表达式的值// 输出:Default ValueSystem.out.println("【orElseGet()】" + nullOptional.orElseGet(() -> "Default Value"));}

orElseThrow()

功能:检查Optional实例是否有值,如果实例值非null,就不做任何处理,否则抛异常Exception。

    public static void orElseThrow() {// orElseThrow与orElse方法类似// 区别在于:orElse传入的是默认值,orElseThrow会抛出lambda表达式或方法生成的异常try {//如果Optional实例值非null,不做任何处理,不会报异常notNullOptional.orElseThrow(Exception::new);} catch (Exception e) {e.printStackTrace();}try {//如果Optional实例值为null,抛异常ExceptionnullOptional.orElseThrow(Exception::new);} catch (Throwable e) {// 输出: nullSystem.out.println("【orElseThrow()】" + e.getMessage());e.printStackTrace();}}

map()

功能:对Optional实例值进行修改
注意:如果Optional实例值非null,就执行map(lambda表达式,任意类型),返回新的Optional实例,否则返回空Optional。

    public static void map() {// 如果Optional实例值非null,执行map(lambda表达式,任意类型),返回新的Optional实例Optional<String> notNullToUpperCase = notNullOptional.map((value) -> value.toUpperCase());// 输出:XIAOXIANSystem.out.println("【map()】" + notNullToUpperCase.orElse("No value found"));Optional<Integer> notNullToInteger = notNullOptional.map((value) -> 1);// 输出:1System.out.println("【map()】" + notNullToInteger.orElse(2));// 如果Optional实例值为null,不用执行map(),返回空OptionalOptional<String> emptyToUpperCase = nullOptional.map((value) -> value.toUpperCase());// 输出:No value foundSystem.out.println("【map()】" + emptyToUpperCase.orElse("No value found"));}

flatMap()

功能:对Optional实例值进行修改
注意:flatMap()与 map()类似,区别在于:传入方法的lambda表达式的返回类型
map():lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional
flatMap:lambda表达式返回值必须是Optionl实例,不会把结果包装为Optional

    public static void flatMap() {// flatMap()与 map()类似,区别在于:传入方法的lambda表达式的返回类型//      map():lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional//      flatMap:lambda表达式返回值必须是Optionl实例,不会把结果包装为Optional//如果Optional的值非null,执行flatMap(lambda表达式),返回Optional类型返回值Optional<String> notNullToUpperCase = notNullOptional.flatMap((value) -> Optional.of(value.toUpperCase()));// 输出:XIAOXIANSystem.out.println("【flatMap()】" + notNullToUpperCase.orElse("No value found"));//如果Optional的值为null,不用执行flatMap(lambda表达式),返回空OptionalOptional<String> optional = nullOptional.flatMap((value) -> Optional.of(value.toUpperCase()));// 输出:No value foundSystem.out.println("【flatMap()】" + optional.orElse("No value found"));}

filter()

功能:判断Option实例有值,并且满足条件
注意:如果有值并且满足条件,就返回该Optional,否则返回空Optional。

    public static void filter() {// 如果满足filter条件,则返回该Option实例,否则返回空OptionalOptional<String> filterTrue = notNullOptional.filter((value) -> value.length() > 6);//输出:xiaoxianSystem.out.println("【filter】" + filterTrue.orElse("不滿足filter條件"));//如果不满足filter条件,则返回空OptionalOptional<String> filterFalse = notNullOptional.filter((value) -> value.length() > 10);//输出:不满足filter條件System.out.println("【filter】" + filterFalse.orElse("不滿足filter條件"));}

二、推荐写法

1、如果实例值不为null,就返回值,否则为null

        // 之前写法User user1 = userOptional.isPresent() ? userOptional.get() : null;// 推荐写法User user2 = userOptional.orElse(null);

2、如果实例值不为null,就返回值,否则进行指定操作

        // 之前写法User user3 = userOptional.isPresent() ? userOptional.get(): getUser();// 推荐写法User user4 = userOptional.orElseGet(() -> getUser());

3、如果实例值不为null,就进行指定操作

        // 之前写法if (userOptional.isPresent()) {System.out.println(userOptional.get());}// 推荐写法userOptional.ifPresent(System.out::println);
        // 之前写法if (userOptional.isPresent()) {getUser();}// 推荐写法userOptional.ifPresent(e->getUser());

4、如果实例值不为null,就获取实例值,并进行指定操作

        // 之前写法List<String> list = null;if(userOptional.isPresent()) {list = userOptional.get().getCourseList();} else {list = Collections.emptyList();}// 推荐写法list = userOptional.map(u -> u.getCourseList()).orElse(Collections.emptyList());
        // 之前写法getName(new User("xiaoxian"));// 推荐写法getNameNew(new User("xiaoxian"));public static String getName(User user){if(user != null) {String name = user.getName();if(name != null) {return name.toUpperCase();} else {return null;}} else {return null;}}public static String getNameNew(User user){Optional<User> userOptional = Optional.ofNullable(user);return userOptional.map(u -> u.getName()).map(name -> name.toUpperCase()).orElse(null);}

三、API示例代码

import java.util.NoSuchElementException;
import java.util.Optional;public class TestOptional {// Optional实例:有值public static Optional<String> notNullOptional = Optional.of("xiaoxian");// Optional实例:空值public static Optional<String> nullOptional = Optional.ofNullable(null);public static void main(String args[]) {of();ofNullable();empty();get();isPresent();ifPresent();orElse();orElseGet();orElseThrow();map();flatMap();filter();}public static void of() {// 创建Optional实例:参数非nullOptional<String> notNullOptional = Optional.of("xiaoxian");// 创建Optional实例:参数为null,抛出 NullPointerExceptiontry {Optional<String> nullOptional = Optional.of(null);} catch (NullPointerException e) {// 输出:nullSystem.out.println("【of()】" + e.getMessage());// 输出:java.lang.NullPointerExceptione.printStackTrace();}}public static void ofNullable() {// ofNullable()与of()相似,区别在于:ofNullable()是可以接受参数为null的情况。// 创建Optional实例:参数非nullOptional<String> notNullOptional = Optional.ofNullable("xiaoxian");// 创建Optional实例:参数为null,不会报错,返回一个空的Optional实例Optional<String> nullOptional = Optional.ofNullable(null);}public static void empty() {// 创建空的Optional实例Optional<String> emptyOptional = Optional.empty();}public static void get() {// 获取Optional实例值,如果Optional实例值非空,就返回值,否则抛出NoSuchElementException// 输出:xiaoxianSystem.out.println("【get()】" + notNullOptional.get());try {//如果Optional实例值为空,抛出 NoSuchElementException// 输出:No value presentSystem.out.println("【get()】" + nullOptional.get());} catch (NoSuchElementException e) {// 输出:java.util.NoSuchElementExceptione.printStackTrace();}}public static void isPresent() {//检查Optional实例是否包含值:如果值存在返回true,否则返回false// 输出:trueSystem.out.println("【isPresent()】" + notNullOptional.isPresent());// 输出:falseSystem.out.println("【isPresent()】" + nullOptional.isPresent());}public static void ifPresent() {//检查Optional实例是否有值,如果实例值非空,就执行lambda表达式,否则不处理notNullOptional.ifPresent(s -> {s = s + " love java";// 输出:xiaoxian love javaSystem.out.println("【ifPresent()】" + s);});// 通过ifPresent修改的值,再次通过get获取的时候不会改变// 输出:xiaoxianSystem.out.println("【ifPresent()】" + notNullOptional.get());}public static void orElse() {//如果Optional实例值非null,返回Optional的值// 输出:xiaoxianSystem.out.println("【orElse()】" + notNullOptional.orElse("There is no value present!"));//如果Optional实例值为null,返回传入的值// 输出:xiaoxian 666System.out.println("【orElse()】" + nullOptional.orElse("xiaoxian 666"));}public static void orElseGet() {// orElseGet与orElse方法类似// 区别在于:orElse传入的是默认值,orElseGet可以接收一个lambda表达式生成默认值//如果Optional实例值非null,返回Optional的值// 输出:xiaoxianSystem.out.println("【orElseGet()】" + notNullOptional.orElseGet(() -> "Default Value"));//如果Optional实例值为null,返回lambda表达式的值// 输出:Default ValueSystem.out.println("【orElseGet()】" + nullOptional.orElseGet(() -> "Default Value"));}public static void orElseThrow() {// orElseThrow与orElse方法类似// 区别在于:orElse传入的是默认值,orElseThrow会抛出lambda表达式或方法生成的异常try {//如果Optional实例值非null,不做任何处理,不会报异常notNullOptional.orElseThrow(Exception::new);} catch (Exception e) {e.printStackTrace();}try {//如果Optional实例值为null,抛异常ExceptionnullOptional.orElseThrow(Exception::new);} catch (Throwable e) {// 输出: nullSystem.out.println("【orElseThrow()】" + e.getMessage());e.printStackTrace();}}public static void map() {// 如果Optional实例值非null,执行map(lambda表达式,任意类型),返回新的Optional实例Optional<String> notNullToUpperCase = notNullOptional.map((value) -> value.toUpperCase());// 输出:XIAOXIANSystem.out.println("【map()】" + notNullToUpperCase.orElse("No value found"));Optional<Integer> notNullToInteger = notNullOptional.map((value) -> 1);// 输出:1System.out.println("【map()】" + notNullToInteger.orElse(2));// 如果Optional实例值为null,不用执行map(),返回空OptionalOptional<String> emptyToUpperCase = nullOptional.map((value) -> value.toUpperCase());// 输出:No value foundSystem.out.println("【map()】" + emptyToUpperCase.orElse("No value found"));}public static void flatMap() {// flatMap()与 map()类似,区别在于:传入方法的lambda表达式的返回类型//      map():lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional//      flatMap:lambda表达式返回值必须是Optionl实例,不会把结果包装为Optional//如果Optional实例值非null,执行flatMap(lambda表达式),返回Optional类型返回值Optional<String> notNullToUpperCase = notNullOptional.flatMap((value) -> Optional.of(value.toUpperCase()));// 输出:XIAOXIANSystem.out.println("【flatMap()】" + notNullToUpperCase.orElse("No value found"));//如果Optional实例值为null,不用执行flatMap(lambda表达式),返回空OptionalOptional<String> optional = nullOptional.flatMap((value) -> Optional.of(value.toUpperCase()));// 输出:No value foundSystem.out.println("【flatMap()】" + optional.orElse("No value found"));}public static void filter() {// 如果满足filter条件,则返回该Option实例,否则返回空OptionalOptional<String> filterTrue = notNullOptional.filter((value) -> value.length() > 6);//输出:xiaoxianSystem.out.println("【filter】" + filterTrue.orElse("不滿足filter條件"));//如果不满足filter条件,则返回空OptionalOptional<String> filterFalse = notNullOptional.filter((value) -> value.length() > 10);//输出:不满足filter條件System.out.println("【filter】" + filterFalse.orElse("不滿足filter條件"));}
}

四、推荐示例代码

import java.util.Collections;
import java.util.List;public class UseOptional {public static User getUser() {return new User("xiaoxian");}public static void main(String[] args) {Optional<User> userOptional = Optional.of(new User("xiaoxian"));// 之前写法User user1 = userOptional.isPresent() ? userOptional.get() : null;// 推荐写法User user2 = userOptional.orElse(null);// 之前写法User user3 = userOptional.isPresent() ? userOptional.get() : getUser();// 推荐写法User user4 = userOptional.orElseGet(() -> getUser());// 之前写法if (userOptional.isPresent()) {System.out.println(userOptional.get());}// 推荐写法userOptional.ifPresent(System.out::println);// 之前写法if (userOptional.isPresent()) {getUser();}// 推荐写法userOptional.ifPresent(e -> getUser());// 之前写法List<String> list = null;if (userOptional.isPresent()) {list = userOptional.get().getCourseList();} else {list = Collections.emptyList();}// 推荐写法list = userOptional.map(u -> u.getCourseList()).orElse(Collections.emptyList());// 之前写法getName(new User("xiaoxian"));// 推荐写法getNameNew(new User("xiaoxian"));}public static String getName(User user) {if (user != null) {String name = user.getName();if (name != null) {return name.toUpperCase();} else {return null;}} else {return null;}}public static String getNameNew(User user) {Optional<User> userOptional = Optional.ofNullable(user);return userOptional.map(u -> u.getName()).map(name -> name.toUpperCase()).orElse(null);}
}class User {public String name;public List<String> courseList;public User() {}public User(String name) {this.name = name;}public String getName() {return name;}public List<String> getCourseList() {return courseList;}
}

Java——》Optional用法相关推荐

  1. java optional用法_2019年 Java 调查报告:“被取代”是不存在的!

    作者 | Nikos Vaggalis 译者 | 冬雨 策划 | 田晓旭 尽管 Java 被称为编程语言的"老马",但它仍在不断发展. 在 Tiobe 排行榜中,它仍然是的第一名, ...

  2. java optional 用法_Java 8中的Optional: 如何正确使用?

    Java 8中出现一个新的Optional类型,和其他语言中null的替代品类似. 本文将讨论如何使用这种新类型,即它的主要用例是什么. 什么是Optional类型? Optional是对单个对象包装 ...

  3. java optional 用法_理解、学习与使用Java中的Optional

    从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都非常了解的异 ...

  4. java optional 用法_Java8 中的 Optional 相关用法

    基本方法: of() 为非 null 的值创建一个 Optional 实例 isPresent() 如果值存在,返回 true,否则返回 false get() 返回该对象,有可能返回 null 应用 ...

  5. java resume过时方法_学点开发|关于Java多线程用法解析

    在进行学习之前,我们先来了解下,什么是Java多线程: 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.为了让大家更清晰读懂关于Java多线程用法,由以下几点入手学,帮 ...

  6. java正则表达式用法示例_Java正则表达式教程及示例

    java正则表达式用法示例 当我开始使用Java时,正则表达式对我来说是一场噩梦. 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习. 什么是正则表达式? 正则表达式定义 ...

  7. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  8. java反射用法示例_Java包| 类型,用法,示例

    java反射用法示例 配套 (Packages) Packages in Java is simply a mechanism to encapsulate (i.e. to put in a sho ...

  9. java反射用法示例_Java反射示例教程

    java反射用法示例 Java Reflection provides ability to inspect and modify the runtime behavior of applicatio ...

  10. java Optional操作

    目录 Optional对象的创建 isPresent()和isEmpty()判空处理 ifPresent()和ifPresentOrElse()的条件动作 Optional对象中获取值 orElse( ...

最新文章

  1. Python基础知识详解
  2. 【计算机视觉】森林火灾检测-1
  3. Python Django 可变参数*与**的区别
  4. bootstrap时间控件
  5. Eclipse集成PyDev5.2.0开发插件
  6. 使用vSphere Power Cli初始化数据中心
  7. Node-express写接口的详细步骤
  8. bm算法java,图解 BM 算法
  9. 计算机网络第七版 部分详细答案
  10. 信锐(SUNDRAY)无线控制器wifi无线上网短信认证设置流程
  11. 2017年高教社杯全国大学生数学建模竞赛(A题)
  12. vue:移动端使用ckplayer
  13. python 制作淘宝秒杀脚本
  14. 数组可以存放实数吗?
  15. 简单的SWF视频播放器代码
  16. SD-Host SD_CLK模块
  17. Xilinx IDELAYCTRL
  18. bloomFilter和哈希函数murmur3
  19. Python之进程 3 - 进程池和multiprocess.Poll
  20. Thymeleaf全解

热门文章

  1. 软文撰写想获成功这三点要注意
  2. PHP phar详解
  3. 吸金树脂选择性吸附金离子的优势与应用
  4. Java模拟自行车电动车属性调用
  5. 75. SAP ABAP 一个有用的程序正确性辅助工具,Checkpoint group 的使用方法介绍
  6. Java程序设计(高级及专题,java模拟面试视频
  7. 从设计原则看网页字体之美
  8. 使用 C++ 创建你的第一个 Metro 风格应用
  9. 圣诞节活动微信排版?我教你啊!
  10. VS Code语言设置中文