在java中使用emptyIterator

use*_*706 10 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..
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*ash 13

在您实现的API需要迭代器的情况下,您可以使用空迭代器,但是某些代码的逻辑在结果中不会产生任何项.在这种情况下,不返回a 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 较小的内存消耗

    • 该类仅在确实需要时才分配内存.
  • 较小的记忆突变

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