Java Optional - 优雅处理Null值的解决方案

Optional

Optional是java 8引入的一个容器类,用来表示一个值存在或者不存在的情况,它提供了许多方法来避免NullPointerException;我们可以通过这些方法优雅的处理Null值;

public final class Optional<T> {

    private static final Optional<?> EMPTY = new Optional<>(null);
    private final T value;

    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    private Optional(T value) {
        this.value = value;
    }
	// ...

静态方法

public static <T> Optional<T> of(T value)
返回包含指定非空值的Optional实例

public static <T> Optional<T> empty()
返回一个空的Optional实例,这个实例中不存在值。

public static <T> Optional<T> ofNullable(T value)
返回一个包含指定值的Optional,如果指定值为空,则返回一个空的Optional。

实例方法

public T get()
如果Optional中存在一个值,则返回该值,否则抛出NoSuchElementException。

public boolean isPresent()
如果存在值则返回true,否则返回false。

public void ifPresent(Consumer<? super T> consumer)
如果值存在,则使用该值调用指定的消费者,否则不执行任何操作。

public Optional<T> filter(Predicate<? super T> predicate)
如果值存在,并且该值与给定的谓词匹配,则返回一个包含该值的Optional,否则返回一个空的Optional

public <U> Optional<U> map(Function<? super T,? extends U> mapper)
如果存在值,则对其应用所提供的映射函数,如果结果非空,则返回包含结果的Optional。否则返回一个空的Optional。

public <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
如果存在值,则对其应用所提供的与Optional相关的映射函数,返回该结果,否则返回空的Optional。这个方法类似于map(Function),但是所提供的映射器的结果已经是一个Optional,并且如果调用,flatMap不会用额外的Optional来包装它。

public T orElse(T other)
如果存在则返回值,否则返回other。

public T orElseGet(Supplier<? extends T> other)
如果存在则返回值,否则调用other并返回该调用的结果。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X extends Throwable
返回包含的值(如果存在),否则抛出由提供的提供程序创建的异常。

优雅处理

借助于Optional提供的方法,我们就可以进行优雅的处理,比如我们可以调用orElseThrow方法在值为Null时抛出指定的错误;又或者调用orElse方法提供个默认的返回值等;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}

public class Application{
	
	private final UserRepository userRepository;
	
	public void main(){
		User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("User not found"));
		/**
		*
		* User user = userRepository.findByUsername(username)
        *        .orElse(new User("Tom",20));
		*/
		
	}
}

posted on 2024-06-26 22:33  luyifo  阅读(32)  评论(0)    收藏  举报

导航