Skip to content

Optional

About 738 wordsAbout 2 min

2025-05-09

在开发中看到过Optional相关的代码,但是只知道一些简单的API,这里仔细阅读一下Optional类的代码。

为什么会引入Optional类,主要就是来解决NPE问题,就是空指针问题。

一、Optional基础方法代码

// final 修饰,表示不能被继承
public final class Optional<T> {
  
}

先看我熟悉的几个方法吧。

public Optional<String> getNumber(){
    boolean hasNum = true;
    if(hasNum){
        return Optional.of("我有值");
    }
    return Optional.empty();
}

private Optional(T value)

两个构造方法都是私有的,没有办法直接通过new创建对象,只能通过Optional自带的方法创建,像是of创建有参的Optional对象,empty创建无参Optional对象。

// 无参构造函数
private Optional() {
    this.value = null;
}
// 构造函数,传入一个value。
private Optional(T value) {
    this.value = Objects.requireNonNull(value);
}

Object.requireNonNull(T obj)防止对象为空。

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

public static <T> Optional<T> of(T value)

创建一个值为value的Optional对象,value为空

public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}

public static final Optional<?> empty()

创建一个空的Optional

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

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

public static <T> Optional<T> ofNullable(T value)

如果value为空,返回一个空的Optional对象,如果value不为空,返回一个值为value的Optional对象。

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

public T get()

返回Optional对象的值。

public T get() {
    if (value == null) {
        throw new NoSuchElementException("No value present");
    }
    return value;
}

public boolean isPresent()

判断value是否为空,有值返回true, 没有值返回false

public boolean isPresent() {
    return value != null;
}
// 例如
// number value 有值, 有值返回true,没有值返回false
Optional<String> number = getNumber();
boolean present = number.isPresent(); // true

public void ifPresent(Consumer<? super T> consumer)

如果value不为空,就调用consumer的accept方法。

public void ifPresent(Consumer<? super T> consumer) {
    if (value != null)
        consumer.accept(value);
}

public T orElse(T other)

获取值;value不为空返回value,否则返回other

public T orElse(T other) {
    return value != null ? value : other;
}

public T orElseGet(Supplier<? extends T> other)

获取值;

orElse和orElseGet两个方法不同的点在于当Optional对象不为空的时候 orElseGet方法不被调用。

public T orElseGet(Supplier<? extends T> other) {
    return value != null ? value : other.get();
}

例:

public static String getDefaultString(){
    return "默认值";
}

@Test
public void test2(){
  	// hello = “hello"
    String hello = Optional.ofNullable("hello").orElseGet(SelfStream::getDefaultString);
}

public Optional<T> filter(Predicate< ? super T> predicate)

对Optional value进行过滤

如果表达式的结果为false,则返回EMPTY,否则返回过滤后的Optional对象。

public Optional<T> filter(Predicate<? super T> predicate) {
    Objects.requireNonNull(predicate);
    if (!isPresent())
        return this;
    else
        return predicate.test(value) ? this : empty();
}

public<U> Optional<U> map(Function<? super T, ? extends U> mapper)

转换

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return Optional.ofNullable(mapper.apply(value));
    }
}

例如;

Changelog

6/3/25, 1:49 AM
View All Changelog
  • d3a6d-Merge branch 'dev1'on

求求了,快滚去学习!!!

求求了求求了,快去学习吧!

【题单】贪心算法

不知道方向的时候,可以多看看书,书会给你指明下一步该干什么,加油!