• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
haipali
博客园    首页    新随笔    联系   管理    订阅  订阅

Java8新特性之Optional类的妙用

该新特性也是翻java八股翻到的,感觉有点小用,所以记录一下
通常我们在调用方法获取参数时,常常会出现要避免空指针,从而进行一系列判断非空的代码,这部分十分冗长且啰嗦还重复,故可以使用一下今天的主角: Java.util.Optional类

  1. 创建方式
    共有三种方式供您选择
  • 直接创建空的Optional对象,通过Optional.Empty()方法
Optional<Person> optionalPerson = Optional.Empty();
  • 创建带有对象的Optional对象,通过of()方法
Person person = new Person();
Optional<Person> optionalPerson = Optional.of(person);
  • 创建可能为空的Optional对象,跟第二种很像
Person person = null;
Optional<Person> optionalPerson = Optional.of(person);
  1. 常用方法
  • .ofNullable()
    顾名思义,若为空则返回false
  • .ifPresent()
    若不为空则消费该值,通常跟.ofNullable配合使用
String str = "hello java8";
// output: hello java8
Optional.ofNullable(str).ifPresent(System.out::println);
String str2 = null;
// output: nothing
Optional.ofNullable(str2).ifPresent(System.out::println);
  • .orElse()
    若为空返回默认值
public void test(String city) {
    String defaultCity = Optional.ofNullable(city).orElse("unknown");
}
  • .orElseGet
    若为空则调用所设置实例返回默认值
public void test2(String city) {
    // 如果city为空,则调用generateDefaultCity方法
    String defaultCity = Optional.of(city).orElseGet(this::generateDefaultCity);
}
private String generateDefaultCity() {
    return "beijing";
}
  • .orElseThrow
    若为空,抛自定义异常
public void test3(String city) {
    // 如果city为空,则抛出空指针异常。
    String defaultCity = Optional.of(city).orElseThrow(NullPointerException::new);
}
  1. 使用Optional类对比
    使用前:
// before refactor
public String getCity2(Person person) {
    if (person != null) {
        House house = person.getHouse();
        if (house != null) {
            Address address = house.getAddress();
            if (address != null) {
                String city = address.getCity();
                return city;
            }
        }
    }
    return "unknown";
}

代码冗长且重复
使用后

public String getCityUsingOptional(Person person) {
    String city = Optional.ofNullable(person)
            .map(Person::getHouse)
            .map(House::getAddress)
            .map(Address::getCity).orElse("Unknown city");
    return city;
}

哇呜,简洁明了,心里一下就干净了

posted @ 2023-07-16 23:26  蓝光水母  阅读(29)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3