不理解包含自身迭代的Java类定义。

时间:2015-03-16 18:12:28

标签: java generics iterable

我在java项目中遇到了一个令我困惑的类。 它使用类型参数实现Iterable接口,因为它是可迭代的自身。有人可以了解这是什么以及为什么它会有用吗?

public class IndexRequest extends Request implements Cloneable, Iterable<IndexRequest> {
    public enum OpType {insert, update};

    protected Index index;
    protected Type type;
    protected boolean incomingAsArray;
    protected long timeToLive;
    protected String parent;
    protected String route;
    protected LinkedListMultimap<String, IndexRequest> iterable;
    protected String errorMessage;
    protected String stackTrace;
    protected String warnMessage;
    protected OpType opType = OpType.insert;
    protected long versionId;
    protected JsonNode previousDocument;
    protected boolean ignored;
    protected String resultCode;
    protected int retries = 0;
    protected boolean esUpsertFlag = false;
    protected String id = UUID.randomUUID().toString();


    /**
     * Constructor
     */
    public IndexRequest() {
        super();
        logger = LoggerFactory.getLogger(IndexRequest.class);
        this.requestJson = JsonNodeFactory.instance.arrayNode();
    }


    /**
     * Constructor
     */
    public IndexRequest(String endpointPath, String requestId, String user, JsonNode requestJson, Map<String, String[]> requestParameters) {
        super(endpointPath, requestId, user, requestJson, requestParameters);
    }

    /**
     * Initialize our iterable version of this class
     */
    protected void initIterable() {
LinkedListMultimap <String, IndexRequest> contents = LinkedListMultimap.create();
        if (isArray()) {
            ArrayNode docsArray = (ArrayNode) getDocument();
            Iterator<JsonNode> docIterator = docsArray.iterator();
            while (docIterator.hasNext()) {
                IndexRequest is = this.clone(false);
                // generate a new id since this is a new wrapper around a particular doc
                is.id = UUID.randomUUID().toString();
                is.setDocument(docIterator.next());
                contents.put(is.getId(), is);
            }

            iterable = contents;
        }
        else {
            iterable = LinkedListMultimap.create();                     
            iterable.put(getId(), this);
        }
    }

    /**
     * Returns an iterator for this index set
     * @return Iterator<IndexRequest> An iterator for this index set
     */
    public Iterator<IndexRequest> iterator() {
        if (iterable == null) {
            initIterable();
        }
        return iterable.values().iterator();
    }
}

提前谢谢。

2 个答案:

答案 0 :(得分:1)

实现 Iterable 的类可以与新的for循环一起使用。这是一个例子:

List list = new ArrayList();

for(Object o : list){
    //do something o;    
}

Iterable接口只有一个方法:

public interface Iterable<T> {
  public Iterator<T> iterator();    
}

可以将我们自己的集合类型类与新的for循环一起使用。为此,我们的类必须实现java.lang.Iterable接口。并提供iterator方法的实现,您可以在课堂上看到:

  /**
     * Returns an iterator for this index set
     * @return Iterator<IndexRequest> An iterator for this index set
     */
    public Iterator<IndexRequest> iterator() {
        if (iterable == null) {
            initIterable();
        }
        return iterable.values().iterator();
    }

答案 1 :(得分:0)

此类看起来像是在这样的节点的树中定义节点。实例持有从String s到同一类的其他实例的映射:

    protected LinkedListMultimap<String, IndexRequest> iterable;

他们还从父类继承了一些存在/持有其他实例数组的感觉。迭代它们时,它们提供其地图或数组元素的值。