Java8新特性之Optional类的妙用
该新特性也是翻java八股翻到的,感觉有点小用,所以记录一下
通常我们在调用方法获取参数时,常常会出现要避免空指针,从而进行一系列判断非空的代码,这部分十分冗长且啰嗦还重复,故可以使用一下今天的主角: Java.util.Optional类
- 创建方式
共有三种方式供您选择
- 直接创建空的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);
- 常用方法
- .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);
}
- 使用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;
}
哇呜,简洁明了,心里一下就干净了