我在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();
}
}
提前谢谢。
答案 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;
他们还从父类继承了一些存在/持有其他实例数组的感觉。迭代它们时,它们提供其地图或数组元素的值。