繁体   English   中英

实现迭代器设计模式

[英]Implementing iterator design pattern

我有一个类 Example 女巫私有字段Hashmap<Integer, CustomObject> 我的目标是使用Iterable接口访问CustomObject中的所有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();
  }

实际上HashMap有一个方法Map::values()将值的集合作为Collection<T> ,它实际上是一个Iterable<T> (因此可以返回一个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(); .

一个完整的例子,假设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();
    }
}

并在以下任何片段中使用 like:

  • 只要Example是一个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()); }
  • 只要每个Iterable返回其Spliterator通过Stream
     StreamSupport.stream(new Example().spliterator(), false) .forEach(System.out::println);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM