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;
}
哇呜,简洁明了,心里一下就干净了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通