Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >《Java-SE-第三十四章》之Optional

《Java-SE-第三十四章》之Optional

作者头像
用户10517932
发布于 2023-10-07 06:51:53
发布于 2023-10-07 06:51:53
19700
代码可运行
举报
文章被收录于专栏:929KC929KC
运行总次数:0
代码可运行

前言

在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”

博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

Optional介绍

我们平时写代码的时候遇到最多的异常就是空指针,所以很多时候就需要做各种非空判断,而过多的判断会导致代码臃肿,所以JDK8中引用了Optional,它是java.util包下的一个用于代替null 的一个工具类,使该类可以有效的避免空指针异常。

Optional的构造方法

Optional提供了三个静态方法来构造出一个Optional

1. Optional.of(T value)

该方法会接收一个非空的value来构造出optaional.返回的Opational包含value这个值。对于此方法的参数一定不能为null,否则会抛出空指针异常。

定义一个用户类便于后面使用

代码语言:javascript
代码运行次数:0
复制
@Data
@AllArgsConstructor
public class User {
    private String username;
    private String password;
}

Optional.of演示使用

代码语言:javascript
代码运行次数:0
复制
import org.example.Functional.model.User;

import java.util.Optional;

public class Demo7 {
    public static void main(String[] args) {
        User user = null;
        //无论传入方法的是不是null都不会出问题
        Optional<User> user1 = getUser();

    }
    
   private static Optional<User> getUser() {
       User user = new User("张三","12");
       //该方法传入的时候会抛出异常
       return Optional.of(null);
   }
}

运行结果:

给该方法传入null会报空指针异常,所以正确的使用是传非空的值

代码语言:javascript
代码运行次数:0
复制
import org.example.Functional.model.User;

import java.util.Optional;


public class Demo7 {
    public static void main(String[] args) {
        User user = null;
        //无论传入方法的是不是null都不会出问题
        Optional<User> user1 = getUser();
        user1.ifPresent(user2 -> System.out.println(user2.getUsername()));//输出张三
    }

   private static Optional<User> getUser() {
       User user = new User("张三","12");
       //该方法传入null的时候会抛出异常
       return Optional.of(user);
   }
}
2. Optional.ofNullable(T value)

该方法和of的最大区别就是参数可以传入null

代码演示

代码语言:javascript
代码运行次数:0
复制
import org.example.Functional.model.User;

import java.util.Optional;

public class Demo7 {
    public static void main(String[] args) {
        Optional<User> user = Optional.ofNullable(getUser());
        user.ifPresent(user2-> System.out.println(user2.getUsername()));//输出张三
        Optional<User> user2 = Optional.ofNullable(null);
        user2.ifPresent(user3-> System.out.println(user3.getUsername()));//不会出错

    }

     private static User getUser() {
        User user = new User("张三","12");
        return user;
    }
}    
3. Optional.empty()

​ 如果一个方法的返回值类型是Optional类型。而如果我们经判断发现某次计算得到的返回值为null,这个时候就需要把null封装成Optional对象返回。这时则可以使用Optional静态方法empty来进行封装。

代码演示

代码语言:javascript
代码运行次数:0
复制
public class Demo7 {
    public static void main(String[] args) {
        Optional<User> user = getUser();
        user.ifPresent(user2-> System.out.println(user2.getUsername()));
        Optional<Object> empty = Optional.empty();
        System.out.println();

    }

   private static Optional<User> getUser() {
       User user = new User("张三","12");
       //返回的类型为Optional<User>,返回之前是无法保证这个对象一定是非空,所以当可能是null时,我们
       //返回一个Optional.empty()
       return user==null?Optional.empty(): Optional.of(user);
   }
}

调试结果

Optional.empty()会返回一个value为null的 Optional。我们使用构造Optional对象时,传入不为null的对象时,该对象存储在Optional中的value中。

常用方法介绍

1. ifPresent

我们获取到一个Optional对象后肯定需要对其中的数据进行使用。这时候我们可以使用其ifPresent方法对来消费其中的值。这个方法会判断其内封装的数据是否为空,不为空时才会执行具体的消费代码。这样使用起来就更加安全了。

示例代码

代码语言:javascript
代码运行次数:0
复制
public class Demo7 {
    public static void main(String[] args) {
        User user = new User("张三","12");
        Optional<User> user1 = Optional.ofNullable(user);
        user1.ifPresent(user2-> System.out.println(user));
        User user2 = null;
        Optional<User> user3 = Optional.ofNullable(user2);
        user3.ifPresent(user4-> System.out.println(user));//啥也不干
    }
}
2. orElse

如果 Optional 中有值则将其返回,否则返回 orElse 方法传入的参数。但是无论 Optional 是否包含值,orElse 方法的参数都会被求值,也就是说,无论如何都会执行默认值的生成。

示例代码

代码语言:javascript
代码运行次数:0
复制
public class Demo7 {
    public static void main(String[] args) {
        User user = new User("张三","12");
        Optional<User> user1 = Optional.ofNullable(user);
        Optional<User> empty = Optional.empty();
        User user2 = user1.orElse(new User("default","default"));
        User user3 = empty.orElse(new User("NULL","NULL"));
        System.out.println(user2);
        System.out.println(user3);

    }
}    

运行结果:

3. orElseGet

类似于orElse,不同的是只有在 Optional不包含值时,才会调用该函数来生成默认值。这可以提高性能,因为默认值的生成只在需要时才会发生。

示例代码

代码语言:javascript
代码运行次数:0
复制
public class Demo7 {
    public static void main(String[] args) {
        User user = null;
        Optional<User> user1 = Optional.ofNullable(user);
        User user2 = user1.orElseGet(() -> new User("dufault", "default"));
        System.out.println(user2);
    }
}    
4. orElseThrow

获取数据,如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建异常抛出。

示例代码

代码语言:javascript
代码运行次数:0
复制
public class Demo7 {
    public static void main(String[] args) {
        User user = new User("张三","12");
        Optional<User> user1 = Optional.ofNullable(user);
       try {
           User user3 = user1.orElseThrow((Supplier<Throwable>) () -> new RuntimeException("user为空"));
           System.out.println(user3);
       } catch (Throwable e) {
           throw new RuntimeException(e);
       }
    }
 }   
5. isPresent

​ 我们可以使用isPresent方法进行是否存在数据的判断。如果为空返回值为false,如果不为空,返回值为true。但是这种方式并不能体现Optional的好处,更推荐使用ifPresent方法

示例代码

代码语言:javascript
代码运行次数:0
复制
public class Demo7 {
    public static void main(String[] args) {
        User user = new User("张三","12");
        Optional<User> user1 = Optional.ofNullable(user);
        if (user1.isPresent()) {
            System.out.println("user不为null");
        }else {
            System.out.println("user为null");
        }
    }
}    
6. map

​ Optional还提供了map可以让我们的对数据进行转换,并且转换得到的数据也还是被Optional包装好的,保证了我们的使用安全。

示例代码

代码语言:javascript
代码运行次数:0
复制
public class Demo7 {
    public static void main(String[] args) {
        User user = new User("张三","12");
        Optional<User> user1 = Optional.ofNullable(user);
        Optional<String> s = user1.map(user2 -> user2.getUsername());
        s.ifPresent(s2-> System.out.println(s2));
    }
}    
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java8新特性之Optional类
我们从一个简单的用例开始。在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException:
Remember_Ray
2020/08/03
5440
Java8之熟透Optional
在写程序的时候一般都遇到过 NullPointerException,所以经常会对程序进行非空的判断:
用户1195962
2019/09/29
5510
JAVA8实战 - Optional工具类
没错,这又是一个新的专栏,JAVA8可以说是JAVA划时代的一个版本,几乎是让JAVA焕发了第三春(第二春在JDK5),当然里面的新特性也是十分重要的,虽然Java现在都已经到了10几的版本,但是国内多数使用的版本还是JAVA8,所以这个系列将会围绕Java8的新特性和相关工具做一些总结。希望对大家日常学习和工作中有所帮助。
阿东
2021/08/16
1.8K0
关于Optional的一些常用API
该方法的入参是一个非null值,如果该值为null,则抛出NullPointerException,不为Null则返回该值。
关忆北.
2021/12/07
3670
关于Optional的一些常用API
聊一聊Java8 Optional,让你的代码更加优雅
Java8提供了Optional接口,Optional接口能够让我们的代码变得更加的优雅,可读性更高,同时能够很好的避免空指针,因为空指针是一个很让人头疼的问题,特别对于调用第三方接口,如果不知道对象的规约的时候,我们在取值的时候无法知道哪些些值能为空,哪些不能为空,所以容易出现空指针,如果我们谨慎一点,可能会对每一个值进行判空处理,但是将会充斥着大量的if语句,甚是不雅观。
小四的技术之旅
2022/07/26
4000
Optional 详解 Java
构建一个Optional对象;方法有:empty( )、of( )、ofNullable( )
宁在春
2022/10/31
1K0
Optional 详解 Java
JDK8新特性之Optional
Optional是什么 java.util.Optional Jdk8提供 Optional,一个可以包含null值的容器对象,可以用来代替xx != null的判断。 Optional常用方法 of public static <T> Optional<T> of(T value) { return new Optional<>(value); } 为value创建一个Optional对象,如果value为空则 会报出NullPointerException异常。 ofNullable pub
Java技术栈
2018/03/30
6580
JDK8新特性之Optional
【Java 8】巧用Optional之优雅规避NPE问题
空指针异常是最常见的Java异常之一,抛出NPE错误不是用户操作的错误,而是开发人员的错误,应该被避免,那么只能在每个方法中加入非空检查,阅读性和维护性都比较差。
翎野君
2023/05/12
3890
【Java 8】巧用Optional之优雅规避NPE问题
Dating Java8系列之巧用Optional之优雅规避NPE问题
空指针异常是最常见的Java异常之一,抛出NPE错误不是用户操作的错误,而是开发人员的错误,应该被避免,那么只能在每个方法中加入非空检查,阅读性和维护性都比较差。
翎野君
2024/01/05
1340
Dating Java8系列之巧用Optional之优雅规避NPE问题
Lambda Optional使用
Optional 针对空指处理而设计的类型。 Java 8借鉴了Scala和Haskell,提供了一个新的Optional模板,可以用它来封装可能为空的引用。这是一个可以为null的容器对象。 使用 Optional 的好处是可以以一种专门针对null的处理方式,来避免值可能存在 null 导致出现的程序异常。你可以理解为:处理null,就是你的业务。 在实际使用过程中,你会发现 Optional 的灵活性有时候会让你想用在任何可能出现null的地方,不过凡事都有套路可循,只要清楚利弊就知道该如何选择。
潇洒
2023/10/20
3360
java8 新特性 -Optional的常见用法
用户7630333
2023/12/07
4870
【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符
空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,使得我们就不用显式进行空值检测
YourBatman
2019/09/03
2.6K0
Java 8 Optional 最佳指南
想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案。作为一名 Java 程序员,我真的是烦透了 NullPointerException(NPE),尽管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一个对象却发现这个对象的值为 null,于是 Java 虚拟机就怒发冲冠地把它抛了出来当做替罪羊。
沉默王二
2020/03/11
6630
Java 8 Optional 最佳指南
Optional 类解决空指针异常
空指针异常是导致 Java 应用程序失败的最常见原因。以前,为了解决空指针异常,Google 公司著名的 Guava 项目引入了 Optional 类,Guava 通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到 Google Guava 的启发,Optional 类已经成为 Java8 类库的一部分。Optional 实际上是个容器:它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。
BUG弄潮儿
2021/05/17
8110
JAVA——JDK 8新特性学习与整理
在自己工作、开发、学习中,特别是在阅读别人的项目源码时,总是能看到使用Lambda表达式和Stream流的代码写法,这两个新特性是JDK 8主要的特性和自己的编程风格。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8,现如今已经JDK14都出来了,所以了解,阅读,和使用JDK 8新特性是非常有必要的,在面试的过程中也会经常被问到。
不愿意做鱼的小鲸鱼
2022/09/26
5370
JAVA——JDK 8新特性学习与整理
Java8 Optional 的正确使用方式
1.当我们还在以如下几种方式使用 Optional 时, 就得开始检视自己了 调用 isPresent() 方法时 调用 get() 方法时 Optional 类型作为类/实例属性时 Optional 类型作为方法参数时 isPresent() 与 obj != null 无任何区别, 我们的生活依然在步步惊心. 而没有 isPresent() 作铺垫的 get() 调用在 IntelliJ IDEA 中会收到告警。调用 Optional.get() 前不事先用 isPresent() 检查值是否可用. 假
神秘的寇先森
2018/05/30
1.1K0
Java8 Optional类初体验
众所周知,在java语言开发中,NullPointerException是一直被大家所深恶痛绝的。然而在以前的java版本中,对空值的判断有繁琐而无趣。且十分影响代码的美观。例如下面这种情况:
呼延十
2019/07/01
8870
Java基础之Optional类(JDK1.8新特性)
Optional是一个容器,它可以保存类型T的值,或者仅仅保存null,Optional类主要是用来避免空指针异常(NPE),其提供的一系列的方法配合Lambda表达式可以让代码更加清晰,语义化,以及避免了空指针异常的问题,这里要注意是避免空指针异常,而不是避免返回null。
码农飞哥
2021/08/18
5270
【JAVA】你认识强大的 Stream 和 Optional 吗?
早已仰慕 Stream 流久已,终于有机会彻底的了解其特性以及用法了,关于源码的深度理解可能还需要继续增加功底,在学 Stream 的时候,同时认识了强大的 Optional,奈斯!
sidiot
2023/08/31
2470
Guava学习笔记(1) --- Optional类的基本使用
/** * Optional测试类 */ public class OptionalTest { @Test public void test() { //创建空的Optional对象 Optional.empty(); //使用非null值创建Optional对象,不能传入null,负责会报错 //Optional.of(null); Optional.of("123"); //使用任意值创建Optional对象 Optional<Objec
挽风
2021/04/13
3550
相关推荐
Java8新特性之Optional类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验