Java——》Optional用法
一、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用法相关推荐
- java optional用法_2019年 Java 调查报告:“被取代”是不存在的!
作者 | Nikos Vaggalis 译者 | 冬雨 策划 | 田晓旭 尽管 Java 被称为编程语言的"老马",但它仍在不断发展. 在 Tiobe 排行榜中,它仍然是的第一名, ...
- java optional 用法_Java 8中的Optional: 如何正确使用?
Java 8中出现一个新的Optional类型,和其他语言中null的替代品类似. 本文将讨论如何使用这种新类型,即它的主要用例是什么. 什么是Optional类型? Optional是对单个对象包装 ...
- java optional 用法_理解、学习与使用Java中的Optional
从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都非常了解的异 ...
- java optional 用法_Java8 中的 Optional 相关用法
基本方法: of() 为非 null 的值创建一个 Optional 实例 isPresent() 如果值存在,返回 true,否则返回 false get() 返回该对象,有可能返回 null 应用 ...
- java resume过时方法_学点开发|关于Java多线程用法解析
在进行学习之前,我们先来了解下,什么是Java多线程: 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.为了让大家更清晰读懂关于Java多线程用法,由以下几点入手学,帮 ...
- java正则表达式用法示例_Java正则表达式教程及示例
java正则表达式用法示例 当我开始使用Java时,正则表达式对我来说是一场噩梦. 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习. 什么是正则表达式? 正则表达式定义 ...
- java list用法_Java List 用法详解及实例分析
Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...
- java反射用法示例_Java包| 类型,用法,示例
java反射用法示例 配套 (Packages) Packages in Java is simply a mechanism to encapsulate (i.e. to put in a sho ...
- java反射用法示例_Java反射示例教程
java反射用法示例 Java Reflection provides ability to inspect and modify the runtime behavior of applicatio ...
- java Optional操作
目录 Optional对象的创建 isPresent()和isEmpty()判空处理 ifPresent()和ifPresentOrElse()的条件动作 Optional对象中获取值 orElse( ...
最新文章
- Python基础知识详解
- 【计算机视觉】森林火灾检测-1
- Python Django 可变参数*与**的区别
- bootstrap时间控件
- Eclipse集成PyDev5.2.0开发插件
- 使用vSphere Power Cli初始化数据中心
- Node-express写接口的详细步骤
- bm算法java,图解 BM 算法
- 计算机网络第七版 部分详细答案
- 信锐(SUNDRAY)无线控制器wifi无线上网短信认证设置流程
- 2017年高教社杯全国大学生数学建模竞赛(A题)
- vue:移动端使用ckplayer
- python 制作淘宝秒杀脚本
- 数组可以存放实数吗?
- 简单的SWF视频播放器代码
- SD-Host SD_CLK模块
- Xilinx IDELAYCTRL
- bloomFilter和哈希函数murmur3
- Python之进程 3 - 进程池和multiprocess.Poll
- Thymeleaf全解