在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行一
些防御式的检查,所以在代码中常常可见if(obj != null) 这样的判断。JDK1.8为我们提供了
一个Optional类,Optional类能让我们省掉繁琐的非空的判断。

Optional中的方法汇总

使用示例:

package com.example.jdknewuse;import java.util.Optional;/*** @author: liumengbing* @date: 2019/02/21 19:51**/
public class OptionalTest {public static void main(String[] args){/*** of()方法*///创建一个值为张三的String类型的OptionalOptional<String> ofOptional = Optional.of("张三");//如果我们用of方法创建Optional对象时,所传入的值为null,则抛出NullPointerExceptionOptional<String> nullOptional = Optional.of(null);/*** ofNullable()方法*///为指定的值创建Optional对象,不管所传入的值为null不为null,创建的时候都不会报错Optional<String> nullOptional = Optional.ofNullable(null);Optional<String> nullOptional = Optional.ofNullable("lisi");/*** empty()方法*///创建一个空的String类型的Optional对象Optional<String> emptyOptional = Optional.empty();/*** get()方法:*  如果我们创建的Optional对象中有值存在则返回此值,如果没有值存在,则会抛出NoSuchElementException异常。*/Optional<String> stringOptional = Optional.of("张三");System.out.println(stringOptional.get());//注意:若Optional是空的,调用get()方法则会抛出NoSuchElementException异常Optional<String> emptyOptional2 = Optional.empty();System.out.println(emptyOptional.get());/*** orElse()方法:*  如果创建的Optional中有值存在,则返回此值,否则返回一个默认值*/Optional<String> stringOptional = Optional.of("张三");System.out.println(stringOptional.orElse("zhangsan"));Optional<String> emptyOptional = Optional.empty();System.out.println(emptyOptional.orElse("李四"));/*** orElseGet()方法:*  如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值*/Optional<String> stringOptional = Optional.of("张三");System.out.println(stringOptional.orElseGet(() -> "zhangsan"));Optional<String> emptyOptional = Optional.empty();System.out.println(emptyOptional.orElseGet(() -> "orElseGet"));/*** orElseThrow()方法:*  如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常*/Optional<String> stringOptional = Optional.of("张三");System.out.println(stringOptional.orElseThrow(CustomException::new));Optional<String> emptyOptional = Optional.empty();System.out.println(emptyOptional.orElseThrow(CustomException::new));private static class CustomException extends RuntimeException {private static final long serialVersionUID = -4399699891687593264L;public CustomException() {super("自定义异常");}public CustomException(String message) {super(message);}}/*** filter()方法:*  如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象;**  注意:*  Optional中的filter方法和Stream中的filter方法是有点不一样的,Stream中的filter方法是对一堆元素进*  行过滤,而Optional中的filter方法只是对一个元素进行过滤,可以把Optional看成是最多只包含一个元素的Stream。*/Optional<String> stringOptional = Optional.of("zhangsan");System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("王五"));stringOptional = Optional.empty();System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("lisi"));/*** map()方法:*  如果创建的Optional中的值存在,对该值执行提供的Function函数调用*///map方法执行传入的lambda表达式参数对Optional实例的值进行修改,修改后的返回值仍然是一个Optional对象Optional<String> stringOptional = Optional.of("zhangsan");System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("失败"));stringOptional = Optional.empty();System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("失败"));/*** flatMap()方法:* 如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否* 则就返回一个空的Optional对象.flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional,* map方法的mapping函数返回值可以是任何类型T。调用结束时,flatMap不会对结果用Optional封装*///map方法中的lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional。但flatMap方法中的lambda表达式返回值必须是Optionl实例Optional<String> stringOptional = Optional.of("zhangsan");System.out.println(stringOptional.flatMap(e -> Optional.of("lisi")).orElse("失败"));stringOptional = Optional.empty();System.out.println(stringOptional.flatMap(e -> Optional.empty()).orElse("失败"));/*** ifPresent()方法*///ifPresent方法的参数是一个Consumer的实现类,Consumer类包含一个抽象方法,该抽象方法对传入的值进行处理,只处理没有返回值。Optional<String> stringOptional = Optional.of("tom");System.out.println(stringOptional.get());//tomstringOptional.ifPresent(e-> {e = e + "sub";System.out.println(e);//tomsub});System.out.println(stringOptional.get());//tom}
}

特别说明:

of方法,就是提供一个static方法,方法名称叫of,方法的返回值返回当前类,并且把构造函数设置为私有private,用静态of方法来代替构造函数。

public class User {private String username;private Integer age;private User() {}public static User of() {return new User();}private User(String username, Integer age) {this.username = username;this.age = age;}public static User of(String username, Integer age) {return new User(username, age);}
}

jdk1.8新特性(四)——Optional相关推荐

  1. 【Optional类】JDK1.8新特性之Optional类的使用

    这篇文章,主要介绍JDK1.8新特性之Optional类的使用. 目录 一.Optional类 1.1.Optional类介绍 1.2.Optional属性和方法 (1)value属性 (2)私有构造 ...

  2. JDK1.8 新特性(全)

    JDK1.8 新特性 本文主要介绍了JDK1.8版本中的一些新特性,乃作者视频观后笔记,仅供参考. jdk1.8新特性知识点: Lambda表达式 函数式接口 方法引用和构造器调用 Stream AP ...

  3. 【java8新特性】——Optional详解(三)

    一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null ...

  4. jdk1.8新特性的应用-Stream 的终止操作

    jdk1.8新特性的应用-Stream 的终止操作 public class TestStreamApi4 {List<Employee> emps = Arrays.asList(new ...

  5. java 1.7 可变参数,JDK1.7新特性(2):异常和可变长参数处理

    异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...

  6. 黑马程序员————高新技术————JDK1.5新特性

    ----------------------ASP.Net+Android+IOS开发----------------------期待与您交流! JDK1.5新特性 一:静态导入 l  Import语 ...

  7. java基础知识总结:基础知识、面向对象、集合框架、多线程、jdk1.5新特性、IO流、网络编程

    目录 一.基础知识: 二.面向对象 三.集合框架 四.多线程: 五.jdk1.5的新特性 六.IO流 七.网络编程: 一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtua ...

  8. JDK1.5新特性、单例设计模式

    Jdk1.5新特性 一,自动装箱与拆箱     Java有基本数据类型,在这些基本数据类型周围又有包装类.通常,我们需要将一种类型转换成另一种. 自动装包:基本类型自动转为基本数据类型包装类(int& ...

  9. JDK8新特性之Optional

    转载自 JDK8新特性之Optional Optional是什么 java.util.Optional Jdk8提供 Optional,一个可以包含null值的容器对象,可以用来代替xx != nul ...

最新文章

  1. 西安交通大学17年9月课程考试计算机应用基础,西安交通大学17年9月课程考试《计算机应用基础》作业考核试题 (含主观题)...
  2. Serverless Kubernetes 落地实践
  3. windows ffmpeg 的安装
  4. webpack — 概述 (2)
  5. 基于python3的Opencv(一)-打开摄像头显示图像
  6. cxf开发webservice服务端怎么返回固定的报文格式_Spring boot webservice怎么玩? 第277篇...
  7. 万字长文!搞定逃不脱的 DNS 面试题
  8. h3c,nat网络地址转换
  9. rapidxml解析xml文档
  10. python微信库无法登录怎么办出现异常_微信出现异常登录了怎么办
  11. iOS常用的功能(打电话、发短信、发邮件等)
  12. 【报错】UnboundLocalError: local variable ‘xxx‘ referenced before assignment
  13. 3 4j不是合法的python表达式_3+4j不是合法的Python表达式。
  14. Lpms-B2 IMU数据采源码分析 及 TCP/IP握手简单分析
  15. vue 基础域名-单独配置
  16. 互联网黑市分析:攻击敲诈勒索--TOMsInsight 2014.09.22
  17. ChatGPT - 横看成岭侧成峰
  18. opencv实现图像的垂直投影和水平投影
  19. 2022年5月15日小记
  20. Android adb cannot connect to deamon

热门文章

  1. 解决 Flex navigateToURL 中文乱码问题
  2. 解决错误:Re-installation failed due to different application signatures
  3. android jni new/delete 和 new[]/delete[]
  4. strcpy和strncpy
  5. DLL劫持的发展历程
  6. Android 关于ListView中按钮监听的优化问题(方法二)
  7. 方法分享:有序集合分段
  8. 针对不同基础学Java编程的人,提出的小建议?
  9. CentOS7 DNS的添加
  10. P2278 [HNOI2003]操作系统