Java迭代器在参数化类型的空集合上

min*_*49r 30 java collections iterator

在Java中,我需要从我的方法返回一个Iterator.我的数据来自另一个通常可以给我一个迭代器的对象,所以我可以返回它,但在某些情况下,底层数据为null.为了保持一致性,我希望在这种情况下返回一个"空"迭代器,这样我的调用者就不必测试null.

我想写一些类似的东西:

public Iterator<Foo> iterator() {
   if (underlyingData != null) {
      return underlyingData.iterator();  // works
   } else {
      return Collections.emptyList().iterator();  // compiler error
   }
}
Run Code Online (Sandbox Code Playgroud)

但Java编译器抱怨返回Iterator<Object>而不是Iterator<Foo>.施法(Iterator<Foo>)也不起作用.

Ale*_*x B 59

您可以通过以下语法获取Foo类型的空列表:

return Collections.<Foo>emptyList().iterator();
Run Code Online (Sandbox Code Playgroud)

  • 在Java 1.7 Collections API中使用`Collections.emptyIterator()`进行了扩展. (3认同)

GOT*_*O 0 28

Java 7已经出现了很长时间.除非您正在为以前的Java版本开发,否则您将返回一个如下所示的空迭代器:

return Collections.emptyIterator();
Run Code Online (Sandbox Code Playgroud)


Car*_*ter 9

我会更多地遵循

public Iterator<Foo> iterator() {
    if (underlyingData == null)
        return Collections.<Foo> emptyList().iterator();
    return underlyingData.iterator();
}
Run Code Online (Sandbox Code Playgroud)

只是,处理特殊情况并返回,然后处理正常情况.但我的主要观点是你可以避免任务

Collections.<Foo> emptyList().iterator();
Run Code Online (Sandbox Code Playgroud)