首页 Optional 用法
文章
取消

Optional 用法

用途 : 解决npe

1
user.getAddress().getProvince();

上面的代码可能会出现NPE, 于是常常有以下代码:

1
2
3
4
5
6
if(user!=null){
	Address address = user.getAddress();
	if(address!=null){
		String province = address.getProvince();
	}
}

这样子的写法就很丑陋, 于是有了Optional

Optional类主要是内部维护了一个value的对象, 并且提供了一系列的方法对此value做逻辑操作。

Optional 方法

  1. Optional(T value), empty(), of(T value), ofNullable(T value)

    • Optional(T value)私有方法,只能内部创建
    • empty()创建一个值为空的Optional对象
    • of(T value)创建一个Optional对象,当值为空时, 抛NPE
    • ofNullable(T value)创建一个新的Optional对象,当值为空时,创建一个空的Optional对象
  2. orElse(T other), orElseGet(Supplier<? extends T> others), orElseThrow(Supplier<? extends X> exceptionSupplier)

    这三组函数都是在传入的值为null时,进行调用。

    • orElse(T other) 传入的值为null时调用, 不为null时也调用
    • orElseGet(Supplier<? extends T> others) 传入的值为null时调用, 不为null是不调用。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    @Test
    public void test() {
    	User user = null;
    	user = Optional.ofNullable(user).orElse(createUser());
    	user = Optional.ofNullable(user).orElseGet(() -> createUser());
    
    }
    
    public User createUser(){
    	User user = new User();
    	user.setName("zhangsan");
    	return user;
    }
    
    • orElseThrow(Supplier<? extends X> exceptionSupplier) 传入的值为null是抛出一个异常
  3. map(Function<? super T, ? extends U> mapper)和flatMap(Function<? super T, Optional> mapper)

    两者的区别就是

    1
    2
    3
    4
    5
    6
    
    public class User {
    	private String name;
    	public String getName() {
    		return name;
    	}
    }
    
    1
    2
    3
    4
    5
    6
    
    public class User {
    	private String name;
    	public Optional<String> getName() {
    		return Optional.ofNullable(name);
    	}
    }
    
  4. isPresent()和ifPresent(Consumer<? super T> consumer)

    这两组就是ifPresent就是在value值不为空时,做一些操作

    • isPresent() 返回value是否为空
    • ifPresent(Consumer<? super T> consumer), 如果value不为空的时候,将其作为consumer函数的入参进行消费操作。
  5. filter(Predicate<? super T> predicate)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public final class Optional<T> {
        //省略....
      public Optional<T> filter(Predicate<? super T> predicate) {
            Objects.requireNonNull(predicate);
            if (!isPresent())
                return this;
            else
                return predicate.test(value) ? this : empty();
        }
    }
    

    接受一个Predicate入参对Optional中的值做一个过滤操作,

本文由作者按照 CC BY 4.0 进行授权

-

sql基础