为什么java.util.Optional不实现Iterable?

tar*_*sbl 6 java optional java-8

Java 8为什么没有Optional实现Iterable

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

Stu*_*rks 5

我不是Scala或Haskell的专家,但我相信这些语言具有诸如序列理解之类的构造,这些构造使它成为OptionMaybe成为有用Traversable

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

Optional<T> opt = ... ;
for (T t : opt) {
    doSomethingWith(t);
}
Run Code Online (Sandbox Code Playgroud)

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

if (opt.isPresent()) {
    doSomethingWith(opt.get());
}
Run Code Online (Sandbox Code Playgroud)

或最好

opt.ifPresent(this::doSomething);
Run Code Online (Sandbox Code Playgroud)

我不知道一个事实,之所以Optional没有做Iterable。Java 8 lambda专家组举行了几次面对面的会议,可能讨论了很多事情,而且从未写下过很多东西。我很容易想象这个主题是在这样的会议上提出的,并且由于存在诸如这样的更有用的替代方案而被认为不是很有用ifPresent