在这种情况下我真的需要实现迭代器吗?

时间:2015-05-30 09:42:13

标签: java collections iterator

我需要一些关于在Java中使用Iterable<T>的建议。

我有以下课程:

public abstract class Validator implements Comparable<Validator>{
    public abstract boolean validate();
    public abstract int getPriority();

    @Override
    public int compareTo(Validator o) {
        return getPriority() > o.getPriority() ? -1 :
                getPriority() == o.getPriority() ? 0 : 
                    1;
    }
}

我需要创建一个类ValidatorChain,如下所示:

public class ValidatorChain{
    //Contains Collection<Validator>

    // and we can iterate over it with for-each loop in high-to-low priority order
}

也许我应该覆盖Iterable<T>的一些即时实现,而不是从头开始编写我自己的实现。

2 个答案:

答案 0 :(得分:5)

您可以通过委托给集合的迭代器以简单的方式手动编写它:

public class ValidatorChain implements Iterable<Validator> {
  Collection<Validator> validators = ...;
  public Iterator<Validator> iterator() {
    return validators.iterator();
  }
}

如果您需要对其进行排序,您可以对validators集合进行排序或复制:

  public Iterator<Validator> iterator() {
    List<Validator> sorted = new ArrayList<> (validators);
    Collections.sort(sorted);
    return sorted.iterator();
  }

或者使用Java 8:

 public Iterator<Validator> iterator() {
    return validators.stream().sorted().collect(toList()).iterator();
  }

答案 1 :(得分:3)

您只能使用收藏集扩展您的ValidatorChain

public class ValidatorChain extends ArrayList<Validator>{
    //...
}

现在它是可迭代的,因为扩展了ArrayList,它本身是可迭代的