前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 8 新特性 Optional 类学习/应用,NullPointerException空值检测

Java 8 新特性 Optional 类学习/应用,NullPointerException空值检测

作者头像
鳄鱼儿
发布2024-05-22 09:17:59
780
发布2024-05-22 09:17:59
举报

🍀Optional 类

JDK1.8开始引入的特性,Optional 类主要解决空指针异常(NullPointerException)问题。

Optional类是一个可能包含或不包含非空值(可以为null)的容器对象。 如果一个值存在,调用 isPresent()方法将返回true、get()方法将返回该对象。

Optional类提供判断空值的方法,使用其中方法可以不用再显式地进行空值检测。

举例: User类的结构

代码语言:javascript
复制
String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();

在避免出现空指针的情况下,我们常常需要将代码改造成这样:

代码语言:javascript
复制
if (user != null) {
    Address address = user.getAddress();
    if (address != null) {
        Country country = address.getCountry();
        if (country != null) {
            String isocode = country.getIsocode();
            if (isocode != null) {
                isocode = isocode.toUpperCase();
            }
        }
    }
}

在避免了空指针异常的情况下,代码变得冗长,且增加了之后的运维难度。

而利用Optional类,可以将这一判断过程变得赏心悦目。

重构下类,将getter方法修改成返回Optional引用

代码语言:javascript
复制
public class Address {
    private Country country;
​
    public Optional<Country> getCountry() {
        return Optional.ofNullable(country);
    }
    // ...
}
​
public class User {
    private Address address;
  
    public Optional<Address> getAddress() {
        return Optional.ofNullable(address);
    }
    // ...
代码语言:javascript
复制
@Test
public void whenChaining_thenOk() {
    User user = new User("berbai@88.com", "ber");
​
    String result = Optional.ofNullable(user)
      .flatMap(u -> u.getAddress())
      .flatMap(a -> a.getCountry())
      .map(c -> c.getIsocode())
      .orElse("default");
​
    assertEquals(result, "default");
}

通过方法引用可进一步简化代码

代码语言:javascript
复制
     String result2 = Optional.ofNullable(user)
             .flatMap(User::getAddress)
             .flatMap(Address::getCountry)
             .map(Country::getIsocode)
             .orElse("default");
​

🍀方法介绍

🍀Optional应用

创建 Optional 实例

代码语言:javascript
复制
// 创建一个空的Optional对象,此时调用emptyOpt 存在NoSuchElementException
Optional<User> emptyOpt = Optional.empty();
// 创建包含值的 Optional。注意:user必需不为空,否则NullPointerException
Optional<User> opt = Optional.of(user);
// 创建可能包含值或可能为空的 Optional。user可以为空
Optional<User> opt = Optional.ofNullable(user);

访问 Optional 对象的值

代码语言:javascript
复制
String name = "Ber";
Optional<String> opt = Optional.ofNullable(name);
// get() 如果 opt中有一个值,返回值,否则抛出 NoSuchElementException 。 
System.out.println(opt.get());  // 输出Ber,opt为空则NoSuchElementException
// 所以先判断opt是否空
opt.isPresent(); // 返回 true如果存在值,否则为 false 。
opt.ifPresent( u -> System.out.println(u)); // 只有 name 不为 null 的时候才会执行输出。

为空时返回默认值

  1. orElse()
代码语言:javascript
复制
String nameNull = null;
String name = "Ber";
// nameNull 为空,默认值则为name。
System.out.println(Optional.ofNullable(nameNull).orElse(name)); // 输出Ber
​
String name2 = "默认值";
// 如果对象初始值不为空,则默认值会被忽略
System.out.println(Optional.ofNullable(name).orElse(name2)); // 输出Ber,而不是默认值
  1. orElseGet()
代码语言:javascript
复制
// 在有值的时候返回值,如果为空,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果
System.out.println(Optional.ofNullable(nameNull).orElseGet( () -> name)); // 输出Ber
  1. orElse() 和 orElseGet()的区别 在Optional对象为不为空时,两个方法都返回相应的非空值,但orElse()方法任创建了默认值对象,而orElseGet()方法不再创建。

为空返回异常

代码语言:javascript
复制
String nameNull = null;
// 这里设定为空返回IllegalArgumentException•,返回异常可自行定义
Optional.ofNullable(nameNull).orElseThrow( () -> new •IllegalArgumentException•());

Optional对象转换值

  1. map() 如果存在一个值,则应用提供的映射函数,如果结果不为空,则返回一个 Optional结果的 Optional 。
代码语言:javascript
复制
User user = new User("berbai@88.com", "ber");
String email = Optional.ofNullable(user).map(u -> u.getEmail()).orElse("default@gmail.com");
  1. flatMap() 如果一个值存在,应用提供的 Optional映射函数给它,返回该结果,否则返回一个空的 Optional 。
代码语言:javascript
复制
// 在User类增加返回 Optional 方法
public class User {    
    private String sex;
​
    public Optional<String> getSex() {
        return Optional.ofNullable(sex);
    }
    //...
}
​
User user = new User("berbai@88.com", "ber");
user.setSex("男")
String position = Optional.ofNullable(user).flatMap(u -> u.getSex()).orElse("女");

Optional过滤值

  1. filter() 如果一个值存在,并且该值给定的谓词相匹配时,返回一个 Optional描述的值,否则返回一个空的 Optional 。
代码语言:javascript
复制
User user = new User("berbai@88.com", "ber");
// email必须包含‘@’
Optional<User> result = Optional.ofNullable(user).filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🍀Optional 类
  • 🍀方法介绍
  • 🍀Optional应用
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档