汉字魔法师
118.67M · 2026-02-04
Optional<T> 是一个容器类,用于表示一个值可能存在也可能不存在(但若存在,则一定非 null)。
如果值存在,isPresent() 返回 true,get() 可获取该值;
同时还提供了一系列安全处理值存在与否的链式方法,如:
ifPresent():值存在时执行操作orElse() / orElseGet():值不存在时提供默认值map() / filter():对值进行转换或过滤Optional 是一个基于值的类(value-based class) ,不应使用 ==、hashCode()(用于身份识别)或同步操作,否则可能导致不可预测的行为 (理解java的值传递本质)。
它主要用于方法返回值,以更清晰、安全地表达“可能无结果”的语义,避免显式 null 检查。
private static final Optional<?> EMPTYprivate static final Optional<?> EMPTY = new Optional<>();
Optional 实例。Optional<?> 表示“未知类型的空 Optional”。empty() 调用的底层单例(节省内存)。private 的,外部不能直接访问。private final T valueprivate final T value;
作用:存储实际的值。
语义:
value != null → 有值(present)value == null → 无值(empty)不可变性:final 保证 Optional 是不可变对象(符合 value-based 类设计)。
private Optional()private Optional() {
this.value = null;
}
Optional(仅用于初始化 EMPTY)。private。public static <T> Optional<T> empty()public static <T> Optional<T> empty()```
{
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
EMPTY 转为 Optional<T>(利用泛型擦除,运行时安全)。== Optional.empty() 判断是否为空,应使用 isPresent()。private Optional(T value)private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
Optional。null,抛出 NullPointerException。of() 调用。public static <T> Optional<T> of(T value)public static <T> Optional<T> of(T value)
Optional。value == null,抛出 NullPointerException。public static <T> Optional<T> ofNullable(T value)public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
作用:安全地包装可能为 null 的值。
逻辑:
value != null → return of(value)value == null → return empty()最常用的创建方式,用于处理不确定是否为 null 的值。
public T get()public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
value == null),抛出 NoSuchElementException。orElse()、ifPresent() 等。Optional<U> uOptional = list.stream()
.filter(item -> UEnum.XX.getCode().equals(item.getName()))
.findFirst();
if (!uOptional.isPresent()) {
return null;
}
U res = uOptional.get();
return res.getName();
public boolean isPresent()public boolean isPresent() {
return value != null;
}
true → value != nullfalse → value == nullifPresent)。public void ifPresent(Consumer<? super T> consumer)public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
consumer.accept(value);否则什么都不做。Map<String, List<Long>> map = Maps.newHashMap();
Optional.ofNullable(types).ifPresent(list -> map.put(DictAlias.TYPE.getCode(), list));
#使用的是 `Optional` 类的7,10两个方法
public Optional<T> filter(Predicate<? super T> predicate)public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}
作用:对值进行条件过滤。
逻辑:
this(即 empty())predicate.test(value) == true → 返回 thisempty()用途:链式过滤。
示例:
Optional<String> s = Optional.of("hello");
s.filter(x -> x.length() > 10); // 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));
}
}
empty()mapper.apply(value),然后用 ofNullable() 包装结果mapper 返回 null,结果是 empty(),不会抛 NPE。Optional<User> 到 Optional<String>)。map 的核心价值.map().filter().map() 风格。if (x != null)。# 1.Optional 有值,且 `mapper` 返回非 null
Optional<User> userOpt = Optional.of(new User("alice"));
Optional<String> upperName = userOpt.map(User::getName) //Optional["alice"]
.map(String::toUpperCase); // Optional["ALICE"]
System.out.println(upperName); // Optional[ALICE]
# 2.Optional 有值,但 `mapper` 返回 `null`
Optional<String> opt = Optional.of("hello");
// 假设有一个函数可能返回 null
Optional<String> result = opt.map(s -> s.equals("world") ? "OK" : null);
System.out.println(result); // Optional.empty
# 3.Optional 本身为空 `mapper` 根本不会被执行
Optional<User> emptyUser = Optional.empty();
Optional<String> name = emptyUser.map(User::getName); // 不会调用 getName()
System.out.println(name); // Optional.empty
// 传统方式(需要多层 null 检查)
User user = getUser(); // 可能返回 null
String upperName = null;
if (user != null) {
String name = user.getName(); // getName() 可能返回 null!
if (name != null) {
upperName = name.toUpperCase();
}
} // 最终 upperName 还可能是 null
VS 用 `Optional.map()`
Optional<String> upperName = Optional.ofNullable(getUser())
.map(User::getName)
.map(String::toUpperCase); // 自动处理所有 null 情况
public <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
作用:对值应用一个返回 Optional 的函数,并“拍平”嵌套。
与 map 的区别:
map:Optional<T> → Optional<Optional<U>>(需要拍平)flatMap:Optional<T> → Optional<U>(自动拍平)用途:处理返回 Optional 的方法链。
示例:
userOpt.flatMap(User::getAddress); // getAddress() 返回 Optional<Address>
map vs flatMap 快速区分| 方法 | 适用场景 | 返回类型处理 |
|---|---|---|
map | 转换函数返回 普通对象(如 String, Integer) | 自动包装为 Optional<U> |
flatMap | 转换函数返回 Optional<U> | 不二次包装,直接返回该 Optional |
// map 会导致嵌套
Optional<Optional<String>> bad = userOpt.map(u -> Optional.of(u.getName()));
// flatMap 避免嵌套
Optional<String> good = userOpt.flatMap(u -> Optional.of(u.getName()));
public T orElse(T other)public T orElse(T other) {
return value != null ? value : other;
}
作用:有值返回值,否则返回 other。
注意:other 是立即求值的(即使不用也会计算)。
示例:
# orElse方法
String name = opt.orElse("Guest");
# 7,14组合方法
Optional.ofNullable(users).orElse(Collections.emptyList())
public T orElseGet(Supplier<? extends T> other)public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
other.get() 获取默认值。Supplier 是惰性求值,仅在需要时调用(适合开销大的操作)。config.orElseGet(() -> loadFromDisk());
public <X extends Throwable> 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();
}
}
作用:有值返回值,否则抛出异常。
用途:替代 get(),提供清晰的错误语义。
示例:
user.orElseThrow(UserNotFoundException::new);
public boolean equals(Object obj)@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Optional)) {
return false;
}
Optional<?> other = (Optional<?>) obj;
return Objects.equals(value, other.value);
}
规则:
Optionalequals() 相等用途:支持集合操作(如 Set<Optional>),但不推荐这样做。
public int hashCode()@Override
public int hashCode() {
return Objects.hashCode(value);
}
规则:
value.hashCode()0与 equals 一致,满足哈希契约。
public String toString()@Override
public String toString() {
return value != null
? String.format("Optional[%s]", value)
: "Optional.empty";
}
格式:
"Optional[value]""Optional.empty"用途:调试友好,明确区分空与非空。
表格
| 类别 | 方法 | 核心目的 |
|---|---|---|
| 创建 | empty(), of(), ofNullable() | 安全构造 Optional |
| 检查 | isPresent(), get() | 判断/获取值(谨慎用 get) |
| 消费 | ifPresent() | 有值则执行副作用 |
| 转换 | map(), flatMap() | 链式处理值 |
| 过滤 | filter() | 条件保留值 |
| 回退 | orElse(), orElseGet(), orElseThrow() | 处理无值情况 |
| 对象契约 | equals(), hashCode(), toString() | 支持调试和集合(但不鼓励用于集合) |