JDK8 Optional容器类的常用方法总结

本文主要总结了JDK8中Optional类的常用方法,包括of、empty、ofNullable、isPresent、ifPresent、orElse、orElseGet、orElseThrow、map和flatMap等,通过实例展示了它们的功能和用法,帮助理解和避免NullPointerException。

最近有时间,特将JDK8中新增的Optional的常用方法结合自己的使用和理解,总结一下!
Optional 可以看做一个容器:它可以保存各种类型的值,或者仅仅保存null,即Optional 类是一个可以为null的容器对象。Optional的优点是提供很多有用的方法,这样我们就不用显式进行空值检测而实现避免NullPointerException的情况。Optional 的常用方法查看相关源码就可以了解相应的用法。
常用的方法一个有10个,总结如下:

  1. static Optional of(T value)
    获取一个值为非null的Optional实例,如果传入的参数为null,则报NullPointerException;
    @Test
    public void test(){
       Optional<User> jim = Optional.of(new User("Jim", 20));
       User user = jim.get();
       System.out.println(user);
    }
    
  2. static Optional empty()
    看源码可知,该方法返回值为new Optional();返回一个空的Optional对象;
    Optional empty = Optional.empty();
  3. static Optional ofNullable(T value)
    查看该方法源码:
	public static <T> Optional<T> ofNullable(T value) {
  		 return value == null ? empty() : of(value);
   }

查看源码可看出此方法如果入参为null,则返回空的Optional对象,反之,则返回一个指定非null的Optional实例;

	@Test
   public void test(){
   		Optional<User> optional = Optional.ofNullable(new User("Jim",20));
  		User user = optional.get();//获取的user实例为new User("Jim",20)
   }
  1. boolean isPresent()
    该方法源码为:
  /**
 * Return {@code true} if there is a value present, otherwise {@code false}.
 *
  * @return {@code true} if there is a value present, otherwise {@code false}
 */
 public boolean isPresent() {
		return value != null;
 }

调用者Optional容器对象中的值如果不为null,则返回TRUE;反之返回FALSE;

  1. void ifPresent(Consumer<? super T> consumer)
    调用者Optional如果不为null,则执行实现Consumer接口对应的操作;反之什么也不处理;
  2. T orElse(T other)
    该方法的源码:
	public T orElse(T other) {
   		return value != null ? value : other;
   }

调用该方法的Optional(value)中的值如果为null,则返回入参指定的Optional实例;反之返回调用者自身;
orElse()的入参other可以看做是一个默认值;

@Test
public void test(){
    Optional<User> empty = Optional.empty();
    Optional<User> optional = Optional.of(new User("Jim", 20));

    User tom1 = empty.orElse(new User("Tom", 21));
    User tom2 = optional.orElse(new User("Tom", 21));

    System.out.println(tom1);//User{name='Tom', age=21}
    
    System.out.println(tom2);//User{name='Jim', age=20}
}
  1. T orElseGet(Supplier<? extends T> other)
    如果调用者Optional中有值,则返回调用者中的值;反之,返回Supplier接口产生的返回值;
@Test
public void test(){
   Optional<User> optional = Optional.empty();
   User user = optional.orElseGet(() -> {
       User jerry = new User("Jerry", 10);
       return jerry;
   });
   System.out.println(user);
}

输出的结果是User{name=‘Jerry’, age=10};
8. T orElseThrow(Supplier<? extends X> exceptionSupplier)
参考方法源码:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
   if (value != null) {
       return value;
   } else {
       throw exceptionSupplier.get();
   }
}

如果调用者Optional中有值,则返回调用者中的值;反之,返回Supplier接口抛出的Exception;

@Test
public void test(){
   Optional<User> optional = Optional.empty();
   User user = optional.orElseThrow(() -> new DataNotExistException("值不存在"));
   System.out.println(user);
}

因为调用者为空的Optional对象,故运行结果是抛出DataNotExistException;
9. Optional < U> map(Function<? super T, ? extends U> mapper)
如果Optional容器中有值,则执行对Function接口的Lambda表达式的逻辑;反之,Function接口就不会被调用,返回一个空的Optional容器;

Optional<User> optional = Optional.empty();
Optional<User> optional1 = optional.map(u -> {
  u.setAge(11);
  return u;
});
System.out.println(optional1.isPresent());

执行的结果为FALSE;

Optional<User> optional = Optional.of(new User("Jerry", 10));
Optional<User> optional1 = optional.map(u -> {
  u.setAge(11);
  return u;
});
System.out.println(optional1.get().getAge());

执行的结果为 11;
10. Optional< U> flatMap(Function< ? super T, Optional< U> > mapper)
flatMap()方法与map()方法类似,所不同的是map()方法的返回值为泛型,而flatMap()返回值必须封装为Optional;

@Test
public void test(){
   Optional<User> optional = Optional.empty();
   Optional<User> optional1 = optional.flatMap(u -> {
       u.setAge(11);
       return Optional.of(u);
   });
   System.out.println(optional1);
}

执行结果为:Optional.empty ,表明返回的是一个空的Optional;

@Test
public void test(){
   Optional<User> optional = Optional.of(new User("Jerry", 10));
   Optional<User> optional1 = optional.flatMap(u -> {
       u.setAge(11);
       return Optional.of(u);
   });
   System.out.println(optional1);
}

执行结果为:Optional[User{name=‘Jerry’, age=11}]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值