【问题标题】:Implementing iterator design pattern实现迭代器设计模式
【发布时间】:2021-01-19 15:22:25
【问题描述】:

我有一个类 Example 女巫私有字段 Hashmap<Integer, CustomObject>。我的目标是使用Iterable 接口访问此类中CustomObject 的所有实例。首先,我声明 Example 来实现Iterable<CustomObject>。然后我调用iterator() 方法。但是,我不知道我是否应该指定hasNext() 等,在主代码中输入什么?这是我目前所拥有的:

public class Example implements Iterable<Songs>{
  private HashMap <Integer, CustomObject>;

  @Override
  public Iterator<CustomObject> iterator() {
    for (CustomObject customObject: this){
      System.out.println(customObject);
    }

  public static void main(String[] args) {
    Example.iterator();
  }

【问题讨论】:

    标签: java design-patterns iterator iterable


    【解决方案1】:

    实际上HashMap 有一个方法Map::values()Collection&lt;T&gt; 返回值的集合,实际上是一个 Iterable&lt;T&gt;(因此可以返回Iterator&lt;T&gt;)。

    Map<Integer, CustomObject> map = new HashMap<>();
    Iterator<CustomObject> iterator = map.values().iterator();
    

    此外,您的代码有几个错误:

    • private HashMap &lt;Integer, CustomObject&gt;; 错过了字段名称,并且可能缺少启动。
    • 实现Iterable&lt;Songs&gt;,您必须覆盖public Iterator&lt;CustomObject&gt; iterator()。我猜你的意思是class Example implements Iterable&lt;CustomObject&gt;
    • Iterable::iterator 不是静态方法,所以不能调用Example.iterator();

    一个完整的例子,假设ExampleHashMap map 在你的类中的可迭代委托(你忘记命名它,否则它不会编译和初始化它),那么你可以这样做:

    public class Example implements Iterable<CustomObject> {
    
        private Map<Integer, CustomObject> delegate = ...; // initialize + data
    
        @Override
        public Iterator<CustomObject> iterator() {
            return this.delegate.values().iterator();
        }
    }
    

    并在这些 sn-ps 中使用 like:

    • 只要Example is-an Iterable,那么它可以与增强循环一起使用:
      for (CustomObject customObject: new Example()) {   // Iterable with enhanced loop
          System.out.println(customObject);
      }
      
    • 通过实际的Iterator
      Iterator<CustomObject> iterator = new Example().iterator();
      while (iterator.hasNext()) {
          System.out.println(iterator.next());
      }
      
    • 通过Stream,只要每个Iterable 返回其Spliterator
      StreamSupport.stream(new Example().spliterator(), false)
                   .forEach(System.out::println);
      

    【讨论】:

    • 感谢您的回复,我需要应用迭代器设计模式。这是否满足该要求?我会在我的主要方法中添加上面的代码吗?谢谢
    • 是学校作业吗?我的 sn-ps 通过 JDK 显示了 Iterator 模式的现有实现的用法。如果您需要实现一个,我会从这里开始:journaldev.com/1716/iterator-design-pattern-java。说“需要应用迭代器”对我来说有点含糊,如果我是你,我会向老师询问详细信息。所以......我的回答对于用法没有错,但这取决于上下文和实际要求。无论如何,您现在拥有自己的资源。
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2020-09-09
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多