Optional【JDK8新特性】

描述

Optional类旨在解决空指针异常问题,它是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

避免空指针异常

普通写法

  public String getName(User user) {
    return user != null ? user.getName() : null;
  }

  public void processName(User user) {

    String name = getName(user);
    if(name != null) {
      log.info("hello" + name);
    } else {
      log.info("user not found");
    }

  }

Opational写法

public Optional<String> getName(User user) {
  return Optional.ofNullable(user).map(User::getName);
}

public void processName(User user) {
  getName(user).ifPresent(
    name -> log.info("hello" + name)
  );

  getName(user).orElseThrow(() -> new UserNotFoundException("User not found."));
}

链式调用

根据一个对象的值决定是否继续调用链上的其他方法时,Optional可以让你的代码更加流畅:

public void processUser(User user) {
    Optional.ofNullable(user)
        .filter(u -> u.isActive()) // 只处理活跃用户
        .flatMap(u -> Optional.ofNullable(u.getAddress())) // 获取用户的地址
        .map(Address::getCity) // 获取城市名
        .ifPresent(city -> System.out.println("The user is from " + city)); // 输出城市名
}

在这个例子中,我们首先检查user是否为null,然后检查用户是否活跃,接着获取用户的地址,最后获取城市的名称。如果任何一个步骤的结果是null,整个链式调用就会终止。

合并值

需要合并多个可能为null的值,可以使用Optional的or方法:

public void mergeAddresses(User user) {
    String primaryCity = Optional.ofNullable(user.getPrimaryAddress())
        .map(Address::getCity)
        .orElse("Unknown");

    String secondaryCity = Optional.ofNullable(user.getSecondaryAddress())
        .map(Address::getCity)
        .orElse("Unknown");

    String city = Optional.of(primaryCity)
        .or(() -> Optional.of(secondaryCity))
        .orElse("No City Found");

    System.out.println("City: " + city);
}

尝试获取用户的主要地址和次要地址的城市名。如果主要地址的城市名未知,我们就使用次要地址的城市名。如果两者都未知,就使用默认值"No City Found"。

通过使用Optional,我们可以写出更加安全、易于理解和维护的代码。它帮助我们避免了大量的空值检查,减少了代码中的模板模式,并提高了代码的可读性和可维护性。

posted @   DAawson  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示