为什么java.util.Optional没有实现Iterable?

为什么
Java 8的Optional不能实现Iterable?

我认为这是一个刻意的语言选择,但我想知道为什么. Scala的Option和Haskell的Maybe实现类似于Iterable的遍历方法. FWIW,Java 9将实现Optional.stream()(JDK-8050820).

最佳答案 我不是Scala或Haskell的专家,但我相信这些语言具有序列理解等结构,使其对Option或者可行为Traversable非常有用.

可能是Java的Iterable类似于Traversable,但Java语言的其余部分并没有提供很多支持. Iterable在Java中唯一能做的就是在一个增强型for(“for each”)循环中使用它.例如,考虑Java的Optional是否实现Iterable.那样就可以像这样使用Optional:

Optional<T> opt = ... ;
for (T t : opt) {
    doSomethingWith(t);
}

将其写为循环是一种误导,因为它执行零次或一次.为了减少误导,不妨写一下:

if (opt.isPresent()) {
    doSomethingWith(opt.get());
}

或者最好

opt.ifPresent(this::doSomething);

我不知道Optional是不是Iterable的原因. Java 8 lambda专家小组举行了几次面对面的会议,其中可能讨论过很多事情,而且从未写过.我很容易想象这个话题是在这样的会议上提出的,并且考虑到存在更多有用的替代方案,如ifPresent,因此被认为不是非常有用.

点赞