【问题标题】:Use of emptyIterator in java [duplicate]在java中使用emptyIterator [重复]
【发布时间】:2014-12-04 23:43:45
【问题描述】:

谁能告诉我空迭代器在java中的实时使用是什么?我很想知道为什么需要它? 比如,

 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()

【问题讨论】:

  • 抱歉,作为“可能重复”的链接没有回答我的问题,或者我可能无法理解答案。有人可以详细说明 - 在什么情况下需要它们?
  • 问题的答案其实是:I want to return an "empty" iterator in that case so my callers don't have to test for null :)
  • 好的,谢谢 :) 在不知不觉中我以新问题的名义回答了这个 (stackoverflow.com/questions/821536/…) 问题!所以这个问题可以被标记为重复的答案。不是重复的问题。开个玩笑,无意冒犯。
  • 这根本不是一个坏问题。您可以在此处将其发布为答案。我只是想与网站保持一致。

标签: java iterator


【解决方案1】:

如果您实现的 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

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 2014-08-15
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多