前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Java-SE-第三十四章》之Optional

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

作者头像
用户10517932
发布2023-10-07 14:51:53
1650
发布2023-10-07 14:51:53
举报
文章被收录于专栏:929KC929KC

前言

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

博客主页: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
复制
@Data
@AllArgsConstructor
public class User {
    private String username;
    private String password;
}

Optional.of演示使用

代码语言:javascript
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Optional介绍
    • Optional的构造方法
      • 1. Optional.of(T value)
      • 2. Optional.ofNullable(T value)
      • 3. Optional.empty()
    • 常用方法介绍
      • 1. ifPresent
      • 2. orElse
      • 3. orElseGet
      • 4. orElseThrow
      • 5. isPresent
      • 6. map
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档