[英]How to get the Collection of an iterator in Java?
通常需要設置ArrayList<>
。 其中一個構造函數采用集合,但是沒有構造函數采用迭代器。
如果我有一個迭代器怎么辦? 有沒有一種方法可以“擴展”到提供迭代器的集合以便使用ArrayList<>
構造函數?
具體來說,我有由PropertiesConfiguration.getKeys()
提供的迭代器,它是org.apache.commons的一部分。
沒有這樣的東西, Iterator
的Collection
。 可以獨立於Collection
創建Iterator。 它可以從任何Iterable
獲得,或者甚至可以創建一個實現迭代器的類。
但是,可以通過迭代並逐一添加其元素來從Iterator
獲得ArrayList
:
Iterator<X> it = ...;
List<X> list = new ArrayList<X>();
while (it.hasNext()) {
list.add(it.next());
}
但是請注意,不能對每個可能的迭代器都可靠地完成此操作,因為迭代器有可能永遠迭代,從而導致無限循環,最有可能OutOfMemoryError
。
我建議您看看Google Guava ,這是Google的實用程序庫。 它有一個稱為列表的類,它使您可以執行以下操作:
Iterator<X> it = ...;
List<X> list = Lists.newArrayList(it);
該庫提供了許多對日常Java編碼非常有用的方法。 它主要包含您想要的所有內容,但是在標准Java 6 API中找不到。
沒有真正通用的方法來執行此操作,因為在Java中, Iterator
只是具有以下三種方法的接口: next
, hasNext
和remove
。
獲取迭代器時,將使用工廠方法,該方法為您提供實現該接口的某些類的實例。 如果知道特定的類,則可以查看其文檔或源代碼,以找到是否有一種方法可以找到要迭代的集合。
但是有很多這樣的類。 對於ArrayList
,請查看源代碼以查看所獲得的迭代器類型。
編輯 :
這是Open JDK 7中ArrayList
的源代碼: http : //www.docjar.com/html/api/java/util/ArrayList.java.html
ArrayList
的迭代器是私有內部類Itr
的實例。 這應該不足為奇。 畢竟,迭代器來自工廠方法,因此您真的不應該知道要獲得哪種迭代器。 事實上,如果你能得到的類此實例並訪問其方法(比如,通過反射),你會做壞事。 該迭代器是ArrayList
類的(內部)實現的一部分,並且(如@merryprankster指出)將來可能會更改。
我不知道它是否可能,但是在我看來,這樣的功能不應該存在,因為迭代器可能不是來自集合。 例如,可以創建一個鏈接多個集合的迭代器!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.