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));
*/
}
}
浙公网安备 33010602011771号