簡體   English   中英

如何在Java中獲取迭代器的集合?

[英]How to get the Collection of an iterator in Java?

通常需要設置ArrayList<> 其中一個構造函數采用集合,但是沒有構造函數采用迭代器。

如果我有一個迭代器怎么辦? 有沒有一種方法可以“擴展”到提供迭代器的集合以便使用ArrayList<>構造函數?
具體來說,我有由PropertiesConfiguration.getKeys()提供的迭代器,它是org.apache.commons的一部分。

沒有這樣的東西, IteratorCollection 可以獨立於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只是具有以下三種方法的接口: nexthasNextremove

獲取迭代器時,將使用工廠方法,該方法為您提供實現該接口的某些類的實例。 如果知道特定的類,則可以查看其文檔或源代碼,以找到是否有一種方法可以找到要迭代的集合。

但是有很多這樣的類。 對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM