首页 > 解决方案 > 实现迭代器设计模式

问题描述

我有一个班级 Example 女巫私人领域Hashmap<Integer, CustomObject>CustomObject我的目标是使用接口访问此类中的所有实例Iterable。首先,我声明 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();
  }

标签: javadesign-patternsiteratoriterable

解决方案


实际上HashMap有一个方法Map::values()返回值的集合作为 aCollection<T>实际上是-an Iterable<T>(因此可以返回 an Iterator<T>)。

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

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

  • private HashMap <Integer, CustomObject>;错过了字段名称和可能的启动。
  • 实施Iterable<Songs>你必须覆盖public Iterator<CustomObject> iterator(). 我假设你的意思是class Example implements Iterable<CustomObject>
  • Iterable::iterator不是静态方法,所以你不能调用Example.iterator();.

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

public class Example implements Iterable<CustomObject> {

    private Map<Integer, CustomObject> delegate = ...; // initialize + data

    @Override
    public Iterator<CustomObject> iterator() {
        return this.delegate.values().iterator();
    }
}

并像在任何这些片段中一样使用:

  • 只要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);
    

推荐阅读