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类

一、定义

Optional是一个容器,它可以保存类型T的值,或者仅仅保存null,Optional类主要是用来避免空指针异常(NPE),其提供的一系列的方法配合Lambda表达式可以让代码更加清晰,语义化,以及避免了空指针异常的问题,这里要注意是避免空指针异常,而不是避免返回null。

二、Optional方法的使用

1、empty 方法

empty 方法返回一个不包含值的Optional实例,注意不保证返回的empty是单例,不要用==比较。

public static<T> Optional<T> empty()

2、of 方法返

of 方法返回一个Optional实例,传入的值必须是非空值,传入null会抛出空指针异常。

public static <T> Optional<T> of(T value)

3、返回一个Optional实例

如果传入值非空,则实例中包含非空值,如果传入null,返回不包含值的empty

public static <T> Optional<T> ofNullable(T value)

4、isPresent 方法

用来判断实例是否包含值,如果不包含非空值返回false,否则返回true

public boolean isPresent();

5、get方法

如果实例包含值则返回当前值,否则抛出NoSushElementException 异常.

public T get();

不推荐调用上面两个方法,因为容易写出如下代码,比原先判断if null的代码还要脏

   public static String getUserName1(User user) {
        Optional<User> user1 = Optional.ofNullable(user);
        if (!user1.isPresent()) {
            return "参数为空";
        }
        return user1.get().getName();
    }

下面是用if-null

  public static String getUserName(User user) {
        if (user == null) {
            return "参数为空";
        }
        return user.getName();
    }

6、ifPresent

(Consumer consumer):如果option对象保存的值不是null,则调用consumer对象,否则不调用

public void ifPresent(Consumer<? super T> consumer);

代码示例:

   Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
     //如果不是null,调用Consumer
        optional1.ifPresent(t -> System.out.println("value is" + t));   //value is1
        //如果是null,不调用Consumer
        optional2.ifPresent(t -> System.out.println("value is " + t));

如上代码,输出结果是 第一条 语句输出value is1,第二条语句没有输出

7、filter方法

如果值存在,并且这个值匹配给定的predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional

Optional<T> filter(Predicate<? super <T> predicate)

代码示例:

  Optional<Integer> optional1 = Optional.ofNullable(1);
       Optional<Object> optional2 = Optional.ofNullable(null);
       Optional<Integer> filter1 = optional1.filter(a -> a == null);
        Optional<Integer> filter2 = optional1.filter((a) -> a == 1);
        Optional<Object> filter3 = optional2.filter(a -> a == null);

    System.out.println(filter1.isPresent()); //false
        System.out.println(filter2.isPresent()); //true
        System.out.println(filter2.get().intValue() == 1); //true

如上代码,演示了filter方法如何使用,输出结果如代码注释所示。

8、 map(Function)

对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)

public<U> Optional<U> map(Function<? super T, ? extends U> mapper);

代码示例:输出结果已经写在注释中。

  Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
  Optional<String> str1Optional = optional1.map(a -> "key" + a);
        Optional<String> str2Optional = optional2.map(a -> "key" + a);
        System.out.println(str1Optional.get()); //key1
        System.out.println(str2Optional.isPresent()); //false

9、flatMap()

功能与map()相似,差别在返回值不同,flatMap方法的mapping函数返回值可以是任何类型T,而map方法的mapping函数必须是Optional

public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper);

代码示例:

  Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
       Optional<Optional<String>> str11Optional = optional1.map(a -> Optional.of("key" + a));
        Optional<String> str22Optional = optional1.flatMap(a -> Optional.of("key" + a));
        System.out.println(str11Optional.get().get()); //key1
        System.out.println(str22Optional.get()); //key1

10、orElse方法

如果optional对象保存的值不是null,则返回原来的值,否则返回value。

public T orElse(T other);

代码示例:

        Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
    System.out.println(optional1.orElse(1000) == 1); //true
        System.out.println((Integer) optional2.orElse(1000) == 1000);//true

11、orElseGet(Supplier supplier)

功能与orElse一样,只不过orElseGet参数是一个对象。

public T orElseGet(Supplier<? extends T> other);

代码示例:

       Optional<Integer> optional1 = Optional.ofNullable(1);
        Optional<Object> optional2 = Optional.ofNullable(null);
   System.out.println(optional1.orElseGet(() -> 1000) == 1); //true
        System.out.println((Integer) optional2.orElseGet(() -> 1000) == 1000); //true

12、orElseThrow方法

值不存在则调用传入的Supplier参数,生成一个异常实例并抛出,这个方法通常与全局异常处理器一起使用,当参数或者其他情况获取不到值是,抛出自定义异常,由异常处理器处理成通用返回结果。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier);

代码示例:

       optional1.orElseThrow(() -> {
            throw new IllegalStateException();
        });
        try {
            optional2.orElseThrow(() -> {
                throw new IllegalStateException();
            });
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }

三、实战参考

假设我们要解析一段json字符串,按照传统的if-null方式我们需要做如下处理:为了获取CUid的值,我们必须要判断三次。

 public static String getOrgUid(String orgResult) {
        if (StringUtils.isBlank(orgResult)) {
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(orgResult);
        if (jsonObject == null) {
            return null;
        }
        if ("success".equals(jsonObject.getString("result"))) {
            return jsonObject.getString("CUid");
        }
        return null;
    }

而运用了我们的Optional类之后,我们可以通过函数式变成来实现。

 public static String getNewUid(String orgResult) {
        String orElse = Optional.ofNullable(orgResult)
                .map(n -> JSONObject.parseObject(n))
                .map(a -> {
                    if ("success".equals(a.getString("result"))) {
                        return a.getString("CUid");
                    }
                    return null;
                }).orElse(null);
        return orElse;
    }

运用了函数式变成,我们只需要三段3段代码就能轻松的驾驭,代码简洁明了。

到此这篇关于Java关于JDK1.8中的Optional类的文章就介绍到这了,更多相关Java的Optional类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

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

  • 一篇文章带你了解jdk1.8新特性--为什么使用lambda表达式

    目录 一.为什么使用Lambda表达式 二.匿名内部类的方式与Lambda表达式方式的比较(示例) 三.需求演示示例 一.创建一个员工实体类 二.普通方式实现 1.代码如下 2.运行main函数,输出结果如下图: 3. 普通方式实现的缺点 三.优化方式一(策略模式实现) 1.定义一个策略接口 2.定义一个过滤年龄的接口实现类 3.定义一个过滤薪资的接口实现类 4.测试类如下: 5.运行main函数,输出如下: 6. 策略模式实现的缺点 四.优化方式二(匿名内部类实现) 1.定义一个策略接口 2.

  • JDK1.8新特性Stream流式操作的具体使用

    一. 前言 随着Java的发展,越来越多的企业开始使用JDK1.8 版本.JDK1.8 是自 JDK1.5之后最重要的版本,这个版本包含语言.编译器.库.工具.JVM等方面的十多个新特性.本次文章将着重学习Stream. Stream 是JDK1.8 中处理集合的关键抽象概念,Lambda 和 Stream 是JDK1.8新增的函数式编程最有亮点的特性了,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用SQ

  • 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

  • Java下Struts框架中的ActionForm类详解

    ActionForm的应用 (1) .创建一个form类必须继承四个父类中的一个.比如继承ActionForm. (2) .一个form类中的每一个属性都将和页面中form 表单中的每一个元素一一对应 例如. 一个表单为: <form> <input type="text" name="username"></input> <input type="password" name="passwor

  • 解析Java的Hibernate框架中的持久化类和映射文件

    持久化类 Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表.一个映射文件Hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域. 其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类. Hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通Java对象(POJO)编程模型.有下列持久化类的主要规则,但是,这些规则并不是必需的. 将所有的持久化Java类需要一个默认的构造函数. 所有类应该包含为了让容易识别对象内H

  • Java中Optional类及orElse方法详解

    目录 引言 Java 中的 Optional 类 ofNullable() 方法 orElse() 方法 案例 orElseGet() 方法 案例 orElse() 与 orElseGet() 之间的区别 引言 为了让我更快的熟悉代码,前段时间组长交代了一个小任务,大致就是让我整理一下某个模块中涉及的 sql,也是方便我有目的的看代码,也是以后方便他们查问题(因为这个模块,涉及的判断很多,所以之前如果 sql 出错了,查问题比较繁琐). 昨天算是基本完成了,然后今天组长就让给我看一个该模块的缺陷

  • 学会在Java中使用Optional功能

    目录 前言 Nullity Optional Class 客户责任 null Optional Objects 重要方法 创建方法 of ofNullable empty 实例方法 isPresent&isEmpty get orElse系列 orElseThrow系列 ifPresent系列 map flatMap filter 何时使用 返回值 字段 参数 替代方案 null 空对象 例外情况 结论 前言 尽管存在争议,但Optiont极大地改进了Java应用程序的设计.在本文中,我们将了解

  • 详解Java中Optional类的使用方法

    目录 一.Optional类的来源 二.Optional类是什么 三.Optional类用法 四.代码示例 1.创建Optional类 2.判断Optional容器中是否包含对象 3.获取Optional容器的对象 4.过滤 5.映射 五.什么场景用Optional 1.场景一 2.场景二 3.场景三 4.场景四 一.Optional类的来源 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optiona

  • Java8中Optional类型和Kotlin中可空类型的使用对比

    本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 在 Java 8中,我们可以使用 Optional 类型来表达可空的类型. package com.easy.kotlin; import java.util.Optional; import static java.lang.System.out; /** * Optional.ofNullable - 允许传递为 null 参数 *

  • JAVA Optional类用法分享

    Optional在JAVA中被定义为一个容器类,更确切的说只存一个元素的容器. container object which may or may not contain a non-null value. Optional类结构 Optional属性 Optional类中包含两个属性: 类属性:EMPTY 对象属性:value EMPTY属性用来存放一个value为null的Optional对象. value属性用来存放非null对象. Optional方法 Optional的有两个构造方法,

  • Java 将List中的实体类按照某个字段进行分组并存放至Map中操作

    1.JDK1.8之前: 假设有实体类User,里面有字段id,我们将相同id的User进行分组,并存放在Map中.(例子不是很恰当,但很能说明问题) public static void main(String[] args) { List<User> list = new ArrayList<>(); list.add(new User(1, 1)); list.add(new User(1, 2)); list.add(new User(2, 1)); list.add(new

  • 如何使用Java中的Optional

    NullPointerException是非常常见的异常.由于它,程序往往需要大量使用if-else代码块来处理空值,这使得代码看起来不简洁 优雅 ,且不方便自己和他人阅读.本文介绍如何用Optional类来处理null值问题. Optional类 先来看一段代码: String isocode = user.getAddress().getCountry().getIsocode().toUpperCase(); 这段代码在任何一个方法调用时,都有可能抛出NullPointerExceptio

随机推荐