Iterable:可能iterator()返回null,以防无法迭代?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Iterable:可能iterator()返回null,以防无法迭代?相关的知识,希望对你有一定的参考价值。

实现Iterable接口的对象必须具有带此签名的方法:

Iterator<T> iterator()

o作为Iterable,这段代码安全吗?

while(o.iterator().hasNext()) { ... }

换句话说,如果没有什么可以迭代的话,iterator()可能会返回null吗?

编辑:

1-正如你们中的一些人所指出的那样,每次执行o.iterator()时返回的迭代器都是不同的。很公平!我必须同意在写这个问题时忘记了这一点。

让我们说这一行被重写:

Iterator<String> it = o.iterator();
....
....
while(it.hasNext() {...}

2-正如你们中的一些人所指出的,当Iterable.iterator()的文档说:“返回一组类型为T的元素的迭代器时,返回null是一种糟糕的编程习惯。”

但是我的问题是关于是否通过Java API文档中的某些“契约”直接或间接地阻止返回null。对我来说“返回一组T类型元素的迭代器”并不会阻止返回null。我可能错了。

从您的答案和其他研究结论

总体而言:Java API没有意思说迭代器值是否为null,除非在文档中明确说明它。在这种情况下,没有任何说明,但是很好的意义允许认为永远不会从Java API方法返回null迭代器值。对于个人编写的API,这可能会有所不同。

  • 文档中没有任何内容可以防止返回的值为null(例如@NotNull)
  • 在Javadoc中,当预期null时,许多@Return都是显式的
  • This question一般是关于null返回值,有趣。
  • 我发现an attempt用于描述API的语言,尽管它用于.NET
答案

如果没有什么可以迭代的话,iterator()可以返回null吗?

可能会返回null(Java中没有工具可以阻止您这样做)但它永远不应该。而返回Iterator哪个hasNext()方法返回false

您需要知道Iterable对象的目的是与for-each循环一起使用

for (Type item : IterableInstance){
    //handle 'item'
    System.out.println(item);
}

which is translated to something like

for(Iterator<Type> i = someList.iterator(); i.hasNext(); ) {
    Type item = i.next();

    //handle 'item'
    System.out.println(item);
}

因此,如果iterator()返回null,你将在NullPointerException获得i.hasNext()(因为i将持有null)。为了避免NPE,你需要适当的迭代器实例,对于hasNext(),它将返回false(如果没有要迭代的元素)。这将阻止循环迭代。


除了您的代码中还有其他问题

while(o.iterator().hasNext()) { ... }

你在这里做的是每次检查条件时都会创建新的迭代器,因为你正在调用o.iterator(),它将从第一个元素开始迭代。换句话说,如果第一个元素存在,则每次都检查,如果o不为空,则会导致无限循环。

你需要的是什么

Iterator<SomeType> it = o.iterator();
while(it.hasNext()) { ... }
另一答案

换句话说,如果没有什么可以迭代的话,iterator()可能会返回null吗?

没有.Iterable接口的正确实现永远不会从null方法返回iterator()。它将返回一个非null的Iterator,其hasNext()方法立即返回false

然而:

这段代码安全吗?

当然,但它没有做你认为它做的事情,因为iterator()的契约是每次调用iterator()时返回一个不同的迭代器。

以上是关于Iterable:可能iterator()返回null,以防无法迭代?的主要内容,如果未能解决你的问题,请参考以下文章

通过在子类型上返回 Iterator 来实现 Iterable

kotlin中的Sequences(序列)与Iterable(集合)区别

kotlin中的Sequences(序列)与Iterable(集合)区别

为啥 Scala Option.tapEach 返回 Iterable,而不是 Option?

Java8之Iterable接口

使用 Guava 将 Iterable 转换为数组