java8的新特性之optional

本文深入探讨Java Optional类的使用,介绍其构造方法、常见API如get、isPresent、ifPresent、map、filter、orElse及orElseThrow等,通过实例对比展示Optional如何简化空值检查,提升代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​在写代码时,调用了一个方法、三方接口或者反序列化一个对象时,基于不信任原则,对获得的对象进行非空判断是一个程序员最基本的编程素养。

 

先看一段演示代码,连环夺命if判断(该代码只是为了演示效果,过于简单,实际中也不乏与之类似的代码)

 

或许你早起习惯了这种写法,都没有想过使代码变得更加优雅,如下图这般

 

代码是不是很简洁,如果你想了解optional的具体用法,请继续往下看。下文会详细介绍optional的常用方法,每个方法都会有对应的demo

 

optional类中的构造方法是私有的,所以无法通过new的方式创建对象,只能通过以下三种方式创建

/** * 该方式创建一个空的optional,调用optional.get()方法时会返回null值 */Optional optional1 = Optional.empty();/** * 该方式创建的optional如果value为null,会抛出空指针异常 * 如:Optional.of(UserDao.get()),如果UserDao.get()=null,则会抛出空指针 */Optional optional2 = Optional.of(value);/** * 该方式创建的optional,如果value为空则返回一个空的optional,不会抛出空指针 */Optional optional3 = Optional.ofNullable(value);

 

get方法可以获取value,也就是泛型中的对象

Optional<User> optional = Optional.ofNullable(new User());User user = optional.get();

 

isPresent方法判断value不为空

if (optional.isPresent()) {    System.out.println("user对象不为空");}

 

ifPresent方法表示在value不为空时做一些别的操作

optional.ifPresent(user -> {    int age = user.getAge();    System.out.println("获得的age=" + age)})

以上代码等价于

if (optional.isPresent()) {    int age = user.getAge();    System.out.println("获得的age=" + age)}

 

map方法允许你直接对value进行操作,并且不会报空指针,同时返回一个新的optional

Optional<User> optional = optional.map(user -> user.toString());

以上代码等价于

public Optional<String> testMap(User user) {  Optional optional = Optional.of(user);  if (!optional.isPresent())    return Optional.empty();  else {    return Optional.ofNullable(user.toString());  }}

 

filter可以进行过滤,满足条件时返回该optional,不满足条件时返回empty,需要注意的是如果optional为null是不会触发过滤条件的

Optional<User> optional1 = option.filter(u -> u.getAge() > 18);

以上代码等价于

public Optional<User> testFileter(Optional<User> optional) {  User user = optional.get();  if (user == null) {     return optional;   } else {     return user.getAge()>18 ? optional : Optional.empty();   } }

 

orElse方法允许在value为null时设置一个默认值

User user = optional.orElse(new User());

以上代码等价于

if(value == null){  return new User();} else {  return value;}

 

orElseGet方法允许你在value为null做一系列操作,并返回一个新的value

User user = optional.orElseGet(() -> {  User u = new User();  u.setAge(18);  return u;});

以上代码等价于

public User testOrElseGet(User user) {  if (user != null) {        return user;    } else {      User u = new User();      u.setAge(18);      return u;    } }

 

orElseThrow方法在value为空时抛出异常

User user = optional.orElseThrow(() -> new RuntimeException());

以上代码等价于

public User testOrElseThrow(User user) throws Exception {  if (user != null) {    return user;  }  throw new RuntimeException();}

 

通过各种等价的对比,更能体现optional处理非空判断时的优雅,写代码也能成为一种艺术

 


扫码关注我的公众号

每天进步一点点,不负光阴,度几扶人

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值