Java8新特性之Optional类的妙用

发布时间 2023-07-16 23:32:24作者: 蓝光水母

该新特性也是翻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;
}

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