为什么 Java 8 Optional 是作为最终版本实现的,没有“部分”和“无”层次结构?问题总结适用于 Java 的值类型那么这与什么关系呢?Optional为什么我们需要Java中的值类型?实现值类型
在 Java 中,实现为 和 的密封层次结构,而不是密封的层次结构。Optional
public final class Optional<T> { ... }
Some
None
为什么这里不是这样?这是 Java 中缺少 的解决方法吗?这背后有什么更深层次的推理吗?sealed
如果你看一下方法实现,你会发现,通过这种方式,它具有丑陋的空检查:
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));
}
}
它们不仅丑陋,而且如果你有一个更长的方法链,则需要在每次调用期间进行评估,即使从一开始就是空的。isPresent
Optional
如果我们能够将固定的实现传递到链中,则可以避免。
optional
.map(i -> i) // isPresent()
.map(Object::toString) // isPresent()
.map(String::length) // isPresent()
.map(...) // isPresent()
问题
为什么不使用子类型对空事例和非空事例进行建模?
我不是在具体问为什么是 final,而是为什么它没有像许多其他语言那样用 and 实现,所以为什么可选声明为最终类并没有真正的帮助。Optional
Some
None