Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

下面是这个类的一些常用方法!

package OptionalP;

import LambdaP.Employee;
import org.junit.Test;
import java.util.Optional; public class Optional1 {
/*
* Optional 容器类:用于尽量避免空指针异常
* Optional.of(T t) : 创建一个 Optional 实例
* Optional.empty() : 创建一个空的 Optional 实例
* Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
* isPresent() : 判断是否包含值
* orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
* orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
* map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
* flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
*/ @Test
public void test(){
//Optional.of(T t) : 创建一个 Optional 实例
Optional<Employee> employee = Optional.of(new Employee());
System.out.println(employee.get());//LambdaP.Employee{name='null', age=0, salary=0}
//of方法是不能构建一个null对象的,否则会报错 NullPointerException 虽然报空指针,但是这时候我们就不需要一个个的Debug了,直接就能锁定出错行 //Optional.empty() : 创建一个空的 Optional 实例
Optional<Object> empty = Optional.empty();
System.out.println(empty.get());
//empty方法是构建一个新的空Optional对象,Optional中的内容是空的但是Optional对象不是空的,这时候调用get方法获取内容会出错
//NoSuchElementException: No value present //Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
Optional<Object> o = Optional.ofNullable(null);
System.out.println(o.get());
//ofNullable是允许构建一个空对象的,但是同上面一个一样,是无法获取里面的值的,因为没值
//报错java.util.NoSuchElementException: No value present //isPresent() : 判断是否包含值
Optional<Employee> employees = Optional.ofNullable(null);
if(employees.isPresent()){
System.out.println("不为空");
}else {
System.out.println("为空");
}
//为空 由此就可以看出,如果Optional中包含内容的话那么他会返回true,否则返回false //orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
Optional<Object> objectOptional = Optional.ofNullable(null);
Object orElse = objectOptional.orElse(new Employee("orElse", 11, 1555));
System.out.println(orElse);
//LambdaP.Employee{name='orElse', age=11, salary=1555} 可以看出orElse作用了,如果是空就返回后面指定创建的,否则就返回ofNullable后封装的对象 //orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
Optional<Object> o2 = Optional.ofNullable(null);
Object o1 = o2.orElseGet(() -> 1);
System.out.println(o1);
// 1 orElseGet 里面是要求的是一个供给型接口Supplier ,所以就可以根据我们的需求随意的处理和返回任何东西 //map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
Optional<Employee> o3 = Optional.ofNullable(new Employee("orElse", 11, 1555));
Optional<Integer> integer = o3.map((e) -> e.getSalary() + 100000);
System.out.println(integer);
//Optional[101555] 现在就对封装的对象中的工资进行了操作 //flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
Optional<Employee> orElse4 = Optional.ofNullable(new Employee("orElse", 11, 1555));
Optional<Integer> integer4 = orElse4.flatMap((e) -> Optional.ofNullable(e.getSalary() + 100000));
System.out.println(integer4);
//Optional[101555]
//这里需要注意的是返回值必须是一个封装以后的Optional对象
}
}

上面就是一些基本的Optional的操作方法!

Java--8--新特性--Optional--有效防止空指针异常的更多相关文章

  1. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

  2. Java 8 新特性-菜鸟教程 (0) -Java 8 新特性

    Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 ...

  3. Java-Runoob-高级课程:Java 8 新特性

    ylbtech-Java-Runoob-高级课程:Java 8 新特性 1.返回顶部 1. Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Or ...

  4. Java 8 新特性终极指南

    1.前言 毫无疑问,Java 8的发布是自从Java5以来Java世界中最重大的事件,它在编译器.工具类和Java虚拟机等方面为Java语言带来的很多新特性.在本文中我们將一起关注下这些新变化,使用实 ...

  5. Java 8 新特性——检视阅读

    Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...

  6. Java 8新特性解读

    (四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...

  7. JAVA8新特性Optional,非空判断

    Optional java 的 NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过 "防止 NPE,是程序员的基本修养." 但是修养归 ...

  8. Java 8 新特性——实践篇

    Java 8 新特性--实践篇 参考 Java8新特性 重要更新:Lambda 表达式和Stream API Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的 ...

  9. JAVA 8 新特性实用总JAVA 8 新特性实用总结结

    JAVA 8 新特性实用总结 作为一个工作两年多的 老 程序猿,虽然一开始就使用 jdk1.8 作为学习和使用的版本,随着技术的迭代,现有的 JDK 版本从两年前到现在,已经飞速发展到了 JDK 15 ...

  10. Spring 4支持的Java 8新特性一览

    有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...

随机推荐

  1. spring boot集成mybatis分页插件

    mybatis的分页插件能省事,本章记录的是 spring boot整合mybatis分页插件. 1.引入依赖 <!-- 分页插件pagehelper --> <dependency ...

  2. Nginx 配置 HTTPS SSL

    配置文件如下:[可以在阿里云上申请免费证书] #user nobody; worker_processes 1; events { worker_connections 1024; } http { ...

  3. vue前端项目中excel文件下载

    模仿 https://github.com/PanJiaChen/vue-element-admin/ 的下载 创建文件夹vendor 创建文件 Export2Excel.js 内容: /* esli ...

  4. WARNING:Your password has expired --linux 用户密码过期

    今天在ssh 提示  WARNING:Your password has expired 设置用户到期时间 chage -M 36000 用户名 chage -l 用户名 #查看用户信息

  5. 【嵌入式硬件Esp32】MQTT链接测试工具

    1.Eclipse Paho MQTT Utility GUI测试工具 下载地址: 链接:https://pan.baidu.com/s/1ivxk3DWJkod-jBsowlcoBA 提取码:0lp ...

  6. 【C/C++开发】C++编译指令#pragma pack的配对使用

    C++编译指令#pragma pack的配对使用 #pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack ...

  7. LeetCode 872. 叶子相似的树(Leaf-Similar Trees)

    872. 叶子相似的树 872. Leaf-Similar Trees 题目描述 请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个叶值序列. LeetCode872. Leaf- ...

  8. mycat实现读写分离

    1 mysql已经配置好了主从 2 linux 安装java环境 3 linux 安装mycat cd /usr/local # 下载mycat wget http://dl.mycat.io/1.6 ...

  9. PAT(B) 1050 螺旋矩阵(Java:24分)

    题目链接:1050 螺旋矩阵 (25 point(s)) 题目描述 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上 ...

  10. 3. Spark SQL解析

    3.1 新的起始点SparkSession 在老的版本中,SparkSQL提供两种SQL查询起始点,一个叫SQLContext,用于Spark自己提供的SQL查询,一个叫HiveContext,用于连 ...