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

时间:2016-10-13 14:29:27

标签: java java-8 optional

为什么Java 8' Optional实施Iterable

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

1 个答案:

答案 0 :(得分:4)

我不是Scala或Haskell的专家,但我相信这些语言具有序列理解等结构,使OptionMaybe非常有用{{1} }。

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

Optional

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

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

或者最好

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

我不知道opt.ifPresent(this::doSomething); 未成为Optional的原因。{1}} Java 8 lambda专家小组举行了几次面对面的会议,其中可能讨论过很多事情,而且从未写过。我可以很容易地想象在这样的会议上提出这个话题,并且考虑到Iterable等更有用的替代方案的存在而被认为不是很有用。