为什么Java 8' Optional
实施Iterable
?
我认为这是一种刻意的语言选择,但我想知道为什么。 Scala的Option
和Haskell的Maybe
实现了与Iterable
类似的遍历方法。 FWIW,Java 9将实现Optional.stream()
(JDK-8050820)。
答案 0 :(得分:4)
我不是Scala或Haskell的专家,但我相信这些语言具有序列理解等结构,使Option
或Maybe
非常有用{{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
等更有用的替代方案的存在而被认为不是很有用。