深入理解Java8新特性之Optional容器类的应用

1.Optional容器类

Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 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

2.应用举例

下面的代码案例按照上面所列方法顺序给出。首先需要一个Employee类用作测试。

package com.szh.java8;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 *
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {

    private Integer id;
    private String name;
    private Integer age;
    private Double salary;

}
    @Test
    public void test1() {
        Optional<Employee> op = Optional.of(new Employee());
        Employee employee = op.get();
        System.out.println(employee);
    }

    @Test
    public void test2() {
        Optional<Employee> op = Optional.empty();
        System.out.println(op.get());
    }

    @Test
    public void test3() {
        Optional<Employee> op = Optional.ofNullable(new Employee(1001,"张起灵",18,6666.66));
        System.out.println(op.get());
    }

    @Test
    public void test4() {
        Optional<Employee> op = Optional.of(new Employee());
        if (op.isPresent()) {
            System.out.println(op.get());
        }
    }

    @Test
    public void test5() {
        Optional<Employee> op1 = Optional.ofNullable(null);
        Employee employee1 = op1.orElse(new Employee(1001,"张起灵",18,6666.66));
        System.out.println(employee1);

        Optional<Employee> op2 = Optional.ofNullable(new Employee());
        Employee employee2 = op2.orElse(new Employee(1001,"张起灵",18,6666.66));
        System.out.println(employee2);
    }

    @Test
    public void test6() {
        Optional<Employee> op1 = Optional.ofNullable(null);
        Employee employee1 = op1.orElseGet(() -> new Employee(1001,"张起灵",18,6666.66));
        System.out.println(employee1);

        Optional<Employee> op2 = Optional.ofNullable(new Employee());
        Employee employee2 = op2.orElseGet(() -> new Employee(1001,"张起灵",18,6666.66));
        System.out.println(employee2);
    }

    @Test
    public void test7() {
        Optional<Employee> op1 = Optional.of(new Employee(1001,"张起灵",18,6666.66));

        Optional<String> op2 = op1.map(Employee::getName);
        System.out.println(op2.get());

        Optional<String> op3 = op1.flatMap((e) -> Optional.of(e.getName()));
        System.out.println(op3.get());
    }

以上就是深入理解Java8新特性之Optional容器类的应用的详细内容,更多关于Java Optional容器类的资料请关注我们其它相关文章!

(0)

相关推荐

  • JDK8中新增的Optional工具类基本使用

    Optional类的使用 JDK8以前,编写代码,通常会出现 NullPointerException (空指针异常),通常情况下我们都是通过 if ... else... 来对对象进行为空判断,然后再进行逻辑处理,代码写起来也比较冗余. JDK8新增了Optional类,使用该类可以避免我们对空指针的检查,使代码看起来比较优雅.   最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下Optional 这个Optional类注意是解决空指针的问题 1.

  • JDK1.8新特性之方法引用 ::和Optional详解

    一:简介 方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式 静态方法引用,通过类名::静态方法名, 如 Integer::parseInt 实例方法引用,通过实例对象::实例方法,如 str::substring 构造方法引用,通过类名::new, 如 User::new 二:方法引用 public final class Integer { public static int parseInt(String s) throws NumberForm

  • Java关于JDK1.8中的Optional类

    目录 Java关于JDK1.8中的Optional类 一.定义 二.Optional方法的使用 1.empty 方法 2.of 方法返 3.返回一个Optional实例 4.isPresent 方法 5.get方法 6.ifPresent 7.filter方法 8. map(Function) 9.flatMap() 10.orElse方法 11.orElseGet(Supplier supplier) 12.orElseThrow方法 三.实战参考 Java关于JDK1.8中的Optional

  • JAVA8妙用Optional解决判断Null为空的问题方法

    目录 引言 API介绍 1.Optional(T value),empty(),of(T value),ofNullable(T value) 2.orElse(T other),orElseGet(Supplier<? extends T> other)和orElseThrow(Supplier<? extends X> exceptionSupplier) 3.map(Function<? super T, ? extends U> mapper)和flatMap(

  • Java JDK8新增Optional工具类讲解

    Optional 空指针异Optional常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码.受到Google Guava的启发,Optional类已经成为Java 8类库的一部分.Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null.Optional提供很多有用的方法,这样我们就不用显式进行空值检测. 1. 以前对nul

  • 详解JAVA中的OPTIONAL

    一.概述 本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空. Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现.但是 Optional 的意义显然不止于此. 我们从一个简单的用例开始.在 Java 8 之前,任何访问对象方法或属性的调用都可能导致NullPointerException: String isocode = user.getAddress().getCountry().getIsocode().toUpper

  • Java8中Optional类的使用说明

    目录 简介 历史 null带来的种种问题 方案 场景引入 方法说明 构造函数 创建Optional对象 使用map从Optional对象中提取和转换值 使用flatMap链接Optional对象 默认行为及解引用Optional对象1 默认行为及解引用Optional对象2 使用filter剔除特定的值 实战 总结 简介 optional类是java8中引入的针对NPE问题的一种优美处理方式,源码作者也希望以此替代null. 历史 1965年,英国一位名为Tony Hoare的计算机科学家在设计

  • JDK8中Optional类巧用之判空操作

    前言 相信大家肯定所有的开发者都对Java8里面的所有的东西都感兴趣,虽然目前的 JDK 已经更新到 JDK17 了,但是我相信,现在很多公司使用的还都是 JDK8 甚至是 JDK7,但是,就算是有些公司已经升级到 JDK8 但是对于 JDK8 里面的一些东西的使用,却没有使用的淋漓尽致. 今天就给大家放出几个 JDK8 里面比较好用的. JDK8 大家都是知道 JDK8 就开始使用 Lambda 表达式,但是很多不管是在教程上还是在其他的书籍上,都没有说在实际开发的时候去使用上这个 Lambd

  • 深入理解Java8新特性之Optional容器类的应用

    1.Optional容器类 Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指针异常. 常用方法 : Optional.of(T t) : 创建一个 Optional 实例 Optional.empty() : 创建一个空的 Optional 实例 Optional.ofNullable(T t) : 若 t 不为 null,创建 Opti

  • 深入理解Java8新特性之Lambda表达式的基本语法和自定义函数式接口

    1.写在前面 目前我们学习Java主要用到的应该就是Java8了,或者说大部分企业当前使用的也是Java8.那么既然Java8的应用如此之广泛,一定有一些亮点所在: Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期API 其他新特性 速度更快.代码更少(增加了新的语法 Lambda 表达式).强大的 Stream API.便于并行.最大化减少空指针异常 Optional. 2.为什么要使用Lambda表达式? Lambda 是一

  • 深入理解Java8新特性之Stream API的终止操作步骤

    目录 1.写在前面 2.终止操作 2.1 终止操作之查找与匹配 2.2 终止操作之归约与收集 1.写在前面 承接了上一篇文章(说完了Stream API的创建方式及中间操作):深入理解Java8新特性之Stream API的创建方式和中间操作步骤. 我们都知道Stream API完成的操作是需要三步的:创建Stream → 中间操作 → 终止操作.那么这篇文章就来说一下终止操作. 2.终止操作 终端操作会从流的流水线生成结果.其结果可以是任何不是流的值,例如:List.Integer,甚至是 v

  • 深入理解Java8新特性之Stream API的创建方式和中间操作步骤

    目录 1.什么是StreamAPI? 2.Stream API操作的三个步骤 2.1 创建Stream 2.2 中间操作 2.2.1 中间操作之筛选与切片 2.2.2 中间操作之映射 2.2.3 中间操作之排序 1.什么是StreamAPI? Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 m Stream API (java.util.stream.*) . Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复

  • 深入理解Java8新特性之新日期时间API的应用

    目录 1.新旧对比(线程安全问题) 2.LocalDate 3.LocalTime 4.LocalDateTime 5.Instant 6.Duration.Period 7.TestTemporalAdjuster.TestTemporalAdjusters 8.DateTimeFormatter 1.新旧对比(线程安全问题) 我们先来看下面的代码:

  • 深入理解Java8新特性之接口中的默认方法和静态方法

    1.接口中的默认方法和静态方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为 "默认方法" ,默认方法使用 default 关键字修饰. 接口默认方法的 " 类优先 " 原则.若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时 选择父类中的方法.如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略. 接口冲突.如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方

  • java8新特性之Optional的深入解析

    前言 最近脑袋发热追着java8源码看的很起劲,还有了执念,罪过. 本文以jdk1.8.0_111源码为例 public final class Optional<T> {} Optional是一个为了解决NullPointerException设计而生可以包含对象也可以包含空的容器对象.封装了很多对空处理的方法也增加了filter.map这样的检索利器,其中函数式编程会有种炫酷到爆的感觉. 基础测试用例对象: public class Java8OptionalTest { List<

  • Java8新特性Optional类处理空值判断回避空指针异常应用

    目录 一.序言 二.问题复原 (一)素材准备 (二)模拟演示 1.传统方式 2.优雅方式 三.小结 一.序言 空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常.Java8新特性之Optional为此类问题提供了优雅的解决方式. 广大程序员朋友对空值异常刻骨铭心,因此Optional一经推出,广受赞誉. 二.问题复原 (一)素材准备 public class LoginUser implements UserDetails { private Lo

  • 熟练掌握Java8新特性之Stream API的全面应用

    1.写在前面 关于Stream API的内容,已经基本上说完了.大家可以参考我的这两篇文章: 深入理解Java8新特性之Stream API的创建方式和中间操作步骤.深入理解Java8新特性之Stream API的终止操作步骤 那么这篇文章主要就是说一个Stream API的简单应用练习题. 2.应用举例 首先,我们需要创建一个交易员类.交易类.存储这两个类对象的List集合. package com.szh.java8.exer; import lombok.AllArgsConstructo

  • Java8新特性之空指针异常的克星Optional类的实现

    Java8新特性系列我们已经介绍了Stream.Lambda表达式.DateTime日期时间处理,最后以"NullPointerException" 的克星Optional类的讲解来收尾. 背景 作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了. 这篇文章我们来学习Java8是如何通过Optional类来避免空指针异常的. 先来看一下不使用Optional类时,我们为了防止N

随机推荐