Java語言Iterator轉(zhuǎn)換成 List的方法
迭代器如何逆向轉(zhuǎn)換成List集合
在 Java 中,迭代器(Iterator)是一種用于遍歷集合中元素的對象,它提供了一種簡單而一致的方式來訪問集合中的元素,而不需要暴露集合內(nèi)部的結(jié)構(gòu)。如果我們需要將一個迭代器逆向轉(zhuǎn)換成 List 集合,可以使用 ListIterator 接口來實現(xiàn)。
ListIterator 接口是 Iterator 接口的子接口,它提供了一些額外的方法,例如 hasPrevious()、previous()、add()、set() 和 remove() 等,可以在迭代器中添加、修改或刪除元素,并且支持逆向遍歷。下面是將迭代器逆向轉(zhuǎn)換成 List 集合的示例代碼:
// 假設(shè)已經(jīng)存在一個迭代器對象 iterator,可以通過以下代碼將其逆向轉(zhuǎn)換為 List 集合 List<Object> list = new ArrayList<>(); ListIterator<Object> listIterator = list.listIterator(list.size()); while (iterator.hasPrevious()) { Object element = iterator.previous(); listIterator.add(element); }
在這個示例中,我們先創(chuàng)建了一個空的 ArrayList 對象,并使用 listIterator() 方法獲取 ListIterator 對象。該方法的參數(shù)是一個整數(shù),表示從指定的位置開始遍歷 List 集合(在這里,我們將其設(shè)置為 List 集合的末尾)。然后,我們使用 while 循環(huán)遍歷迭代器對象中的元素,并將每個元素添加到 ListIterator 對象中。由于 ListIterator 對象支持在任意位置添加元素,因此我們可以將迭代器中的元素逆序添加到 List 集合中。
最終,我們得到了一個包含逆序迭代器中所有元素的 List 集合。需要注意的是,這種轉(zhuǎn)換方式只適用于那些實現(xiàn)了 List 接口的集合類,例如 ArrayList、LinkedList 等。對于其他類型的集合類,可能需要先將其轉(zhuǎn)換為 List 集合,再使用上述代碼進行轉(zhuǎn)換。
拓展
StreamSupport
StreamSupport 是 Java 8 中提供的一個工具類,它提供了一些靜態(tài)方法,用于將傳統(tǒng)的迭代器(Iterator)和 Spliterator 轉(zhuǎn)換為 Java 8 中的 Stream 流。該工具類可以在對傳統(tǒng)集合進行操作時,方便地使用 Java 8 的 Stream API 進行處理。
StreamSupport 中最常用的方法是 stream() 方法,該方法接受一個 Spliterator 對象和一個布爾值參數(shù),用于指定是否開啟 Stream 并行處理模式。以下是 stream() 方法的方法簽名:
public static <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel)
在該方法中,T 表示元素的類型,spliterator 表示要轉(zhuǎn)換為 Stream 的 Spliterator 對象,parallel 表示是否開啟并行處理模式。
除了 stream() 方法,StreamSupport 還提供了其它一些方法,例如:
- stream(Iterator<T> iterator, boolean parallel):將傳統(tǒng)的 Iterator 對象轉(zhuǎn)換為 Stream。
- stream(Spliterator<T> spliterator):將傳統(tǒng)的 Spliterator 對象轉(zhuǎn)換為 Stream。
- stream(Iterable<T> iterable, boolean parallel):將傳統(tǒng)的 Iterable 對象轉(zhuǎn)換為 Stream。
需要注意的是,StreamSupport 工具類中的這些方法返回的是一個 Stream 流,因此可以使用 Java 8 中提供的 Stream API 進行各種操作,例如:過濾、映射、分組、聚合等。
Spliterator
Spliterator(分離器)是 Java 8 中引入的一個新接口,它是 Iterator 接口的擴展,用于支持并行遍歷數(shù)據(jù)流。Spliterator 可以將數(shù)據(jù)流分割成多個部分,每個部分可以在不同線程中進行處理,從而實現(xiàn)數(shù)據(jù)流的并行處理。
Spliterator 接口提供了一些方法,用于支持數(shù)據(jù)流的分割、遍歷以及并行處理:
- tryAdvance(Consumer<? super T> action):嘗試遍歷下一個元素,并將其傳遞給指定的 Consumer。
- forEachRemaining(Consumer<? super T> action):遍歷剩余的所有元素,并將它們傳遞給指定的 Consumer。
- trySplit():嘗試將數(shù)據(jù)流分成兩個部分,返回一個 Spliterator 對象,表示分離后的數(shù)據(jù)流。
- estimateSize():估計剩余未遍歷的元素個數(shù)。
- characteristics():返回 Spliterator 的特性集合。
在使用 Spliterator 進行并行處理時,通常需要遵循一些規(guī)則,例如:
- 數(shù)據(jù)流必須是無序的,并且不能保證每個元素都會被遍歷且僅被遍歷一次。
- 分割后的子 Spliterator 應(yīng)該足夠小,以便于在不同線程中進行處理。通常建議將子 Spliterator 的大小設(shè)置為原始數(shù)據(jù)流大小的 1/2 或 1/4。
- Spliterator 的特性應(yīng)該明確,以便于在并行處理時進行優(yōu)化。例如,如果數(shù)據(jù)流是有序的,則應(yīng)該使用 ORDERED 標(biāo)志;如果數(shù)據(jù)流不可變,則可以使用 IMMUTABLE 標(biāo)志等。
總的來說,Spliterator 提供了一種方便的方式來支持并行處理數(shù)據(jù)流,并且可以根據(jù)實際情況進行靈活的優(yōu)化和調(diào)整。
JAVA中Iterator轉(zhuǎn)List三種方法
使用com.google.common.collect.Lists(推薦)使用org.apache.commons.collections.IteratorUtils(垃圾)遍歷iterator并add進list(不夠優(yōu)雅)
使用com.google.common.collect.Lists
用法:
import com.google.common.collect.Lists; Iterator<Element> myIterator = elementDao.findAll(); List<Element> myList = Lists.newArrayList(myIterator);
源碼:
可以看到這里用了泛型,使得輸出類型確定
public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) { ArrayList<E> list = newArrayList(); Iterators.addAll(list, elements); return list; }
使用org.apache.commons.collections.IteratorUtils
用法:
import org.apache.commons.collections.IteratorUtils; Iterator<Element> myIterator = elementDao.findAll(); List myList=IteratorUtils.toList(myIterator);
源碼:
可以看到這里返回的是List類型,用時需要先判斷類型,再強制轉(zhuǎn)換
public static List toList(Iterator iterator) { return toList(iterator, 10); }
遍歷iterator并add進list
用法:遍歷的方法很多,可以用while等等
Iterator<Element> myIterator = elementDao.findAll(); List<Element> actualList = new ArrayList<Element>(); while (iterator.hasNext()) { actualList.add(iterator.next()); }
本文參考:
到此這篇關(guān)于Java語言 Iterator 如何裝換成 List的文章就介紹到這了,更多相關(guān)java Iterator轉(zhuǎn)換成list內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spring RestTemplate 詳解實踐使用及拓展增強
這篇文章主要介紹了使用Spring RestTemplate 詳解實踐使用及拓展增強,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10使用idea創(chuàng)建web框架和配置struts的方法詳解
這篇文章主要介紹了使用idea創(chuàng)建web框架和配置struts的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09IntelliJ?IDEA?2022.2.3最新激活圖文教程(親測有用永久激活)
今天給大家分享一個?IDEA?2022.2.3?的激活破解教程,全文通過文字+圖片的方式講解,手把手教你如何激活破解?IDEA,?只需要幾分鐘即可搞定,對idea2022.2.3激活碼感興趣的朋友跟隨小編一起看看吧2022-11-11File的API和常用方法詳解_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細介紹了File的API和常用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05SpringBoot+OCR實現(xiàn)PDF內(nèi)容識別的示例代碼
在SpringBoot中,您可以結(jié)合OCR庫來實現(xiàn)對PDF文件內(nèi)容的識別和提取,本文就來介紹一下如何使用 Tesseract 和 pdf2image 對 PDF 文件進行OCR識別和提取,具有一定的參考價值,感興趣的可以了解一下2023-12-12springcloud微服務(wù)基于redis集群的單點登錄實現(xiàn)解析
這篇文章主要介紹了springcloud微服務(wù)基于redis集群的單點登錄實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09使用SpringCache進行緩存數(shù)據(jù)庫查詢方式
這篇文章主要介紹了使用SpringCache進行緩存數(shù)據(jù)庫查詢方式,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10