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

