【问题标题】:Do I really need to implement iterator in that case?在那种情况下我真的需要实现迭代器吗?
【发布时间】:2015-05-30 09:42:13
【问题描述】:

我需要一些关于在 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&lt;T&gt; 的一些即时实现,而不是从头开始编写自己的实现。

【问题讨论】:

    标签: java collections iterator


    【解决方案1】:

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

    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
    • 我怎样才能尊重订单?
    • validators.sort();,使用 Comparable 进行自然排序会按照您的预期对集合进行排序
    • 我的意思是foreach循环的顺序
    • 我希望用户使用 for-each 循环按从高到低的顺序进行迭代
    【解决方案2】:

    您只能使用集合扩展您的 ValidatorChain

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

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

    【讨论】:

    • 如果你只需要一个for每个循环,为什么要扩展arraylist?在这种情况下,组合比继承更有意义......
    • 我同意每个循环只有一个,但是这种方法在将来会很有用,尽管它带来了一些坏事。一个问题是:“我真的需要”@assylias
    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多