在java中使用emptyIterator

时间:2014-10-09 22:04:03

标签: java iterator

有人能告诉我在java中实时使用空Iterator吗?我很想知道为什么需要它? 比如,

 1.  public static <T> Iterator<T> emptyIterator()
 2.  public static <T> ListIterator<T> emptyListIterator()
 3.  public static final <T> Set<T> emptySet(), etc..

来源:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#emptyIterator()

1 个答案:

答案 0 :(得分:11)

如果您实现的API需要迭代器,则可以使用空迭代器,但某些代码的逻辑可能不会在结果中产生任何项。在这种情况下,您将返回一个空迭代器,而不是返回null。您还可以使用空迭代器来节省一些内存并用于测试目的。

以下是一些阻止返回null并同时保存一些内存的示例代码:

class LazyObjectInitialization {

   private Collection<String> items; 

   public final Iterator<String> items() {

      if(items == null || items.isEmpty()) {
         return Collections.emptyIterator(); 
      }

      return items.iterator();
   }

   public final add(String item) { 

      if(items == null) {
         items = new ArrayList<>();
      }

      items.add(item);
   }
}

在上面的类中,在添加元素之前,不会初始化字段items。因此,为了在方法items()中提供预期的行为,我们返回一个空的迭代器。这样做的好处如下:

  • 内存消耗较小

    • 该类仅在真正需要时才分配内存。
  • 较小的记忆突变

    • 在我们向对象添加内容之前,我们永远不会创建迭代器的新实例。
  • 我们永远不会返回null