目錄
前言:
單列集合的遍歷方式:
迭代器遍歷:
增強(qiáng)for遍歷:
lambda方法遍歷:?
總結(jié):
前言:
本篇我們會(huì)講解關(guān)于單列集合的幾種遍歷方式,遍歷集合可以說(shuō)是對(duì)于集合要求掌握的最低技能,因此我們要熟練的掌握遍歷集合的方式。
在這里我們不講for循環(huán)遍歷,for循環(huán)無(wú)法對(duì)單列集合的set子集合進(jìn)行遍歷,因?yàn)閟et集合的特點(diǎn)就是無(wú)序,無(wú)法用索引進(jìn)行遍歷。
單列集合的遍歷方式:
迭代器遍歷:
在ES6中,為了方便遍歷collection數(shù)據(jù)結(jié)構(gòu),引入了可迭代協(xié)議(Iterable protocol)和迭代器協(xié)議(Iterator protocol)。這兩個(gè)協(xié)議一起實(shí)現(xiàn)了遍歷collection的能力。
可迭代協(xié)議指定了collection必須實(shí)現(xiàn)一個(gè)名為[Symbol.iterator]的方法,該方法返回一個(gè)迭代器對(duì)象。而迭代器對(duì)象則定義了一個(gè)next()方法,該方法返回一個(gè)包含value和done屬性的對(duì)象,value表示當(dāng)前的值,done屬性表示當(dāng)前是否遍歷完畢。
JavaScript中有一些內(nèi)置的可迭代對(duì)象,如數(shù)組(Array)、Set、Map、字符串(String)和arguments等。按照可迭代協(xié)議的規(guī)范,這些collection對(duì)象都必須實(shí)現(xiàn)[Symbol.iterator]方法,返回一個(gè)符合迭代器協(xié)議規(guī)范的對(duì)象。
常用的iterator方法:
-
next():返回一個(gè)包含value和done屬性的對(duì)象,value表示當(dāng)前遍歷的值,done表示遍歷是否已經(jīng)結(jié)束。
-
return():用來(lái)提前結(jié)束迭代,然后返回一個(gè)包含value和done屬性的對(duì)象,value表示提前結(jié)束時(shí)的返回值,done屬性為true。
-
throw():用來(lái)主動(dòng)拋出一個(gè)異常,用于在迭代過(guò)程中遇到錯(cuò)誤或異常時(shí)中止遍歷。
案例:
import java.util.Iterator;
public class text05 {
public static void main(String[] args) {
String list="abide";
Iterator<String> it=list.lines().iterator();
String str=it.next();
System.out.println(str);
}
}
在這段Java代碼中,`list` 是一個(gè)字符串變量,調(diào)用了 `lines()` 方法并 `iterator()` 方法將其轉(zhuǎn)換為一個(gè)字符串?dāng)?shù)組對(duì)應(yīng)的迭代器對(duì)象,并將該迭代器對(duì)象賦值給了 `it` 變量。`it.next()` 方法獲取迭代器中的下一個(gè)元素,即字符串?dāng)?shù)組中的第一個(gè)元素,并將其賦值給了 `str` 變量。最后將 `str` 變量的值打印到控制臺(tái)中。
因?yàn)?list 變量中只有一個(gè)字符串 "abide",所以 list.lines()?返回只包含一個(gè)元素的字符串?dāng)?shù)組 ["abide"],且由于是調(diào)用了 iterator()?方法,獲取了對(duì)應(yīng)數(shù)組的迭代器對(duì)象。所以打印的結(jié)果是 "abide"。
除了數(shù)組,其他collection對(duì)象如Set、Map和字符串等也都可以使用迭代器遍歷。
雖然迭代器可以快速指向容器中的元素,但是我們不可以簡(jiǎn)單的認(rèn)為迭代器就是指針。
在 Java 中,迭代器是一種對(duì)象,它允許我們遍歷集合或列表等容器中的元素。迭代器的本質(zhì)是在提供一種通用的方法,以便我們可以訪問(wèn)集合類的內(nèi)部元素,而無(wú)需暴露容器內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。這個(gè)特性使得我們能夠使用同樣的方式遍歷不同類型的容器,同時(shí)保持容器類的封裝性。
迭代器的本質(zhì)包含兩個(gè)方面,一是能夠訪問(wèn)容器內(nèi)部的元素,二是能夠支持前移、后移與刪除等操作。在具體實(shí)現(xiàn)中,迭代器通常會(huì)持有對(duì)容器對(duì)象的引用,并且會(huì)提供 next()、hasNext()、remove() 等方法來(lái)實(shí)現(xiàn)元素的訪問(wèn)與控制操作。此外,Java 迭代器還具有一些重要特性,如快速失敗機(jī)制,支持并發(fā)訪問(wèn)等,以保障程序的正確性和可靠性。
增強(qiáng)for遍歷:
Java 中的增強(qiáng) for 循環(huán)是一種簡(jiǎn)化遍歷數(shù)組或集合的語(yǔ)法。它可以在不顯式定義循環(huán)計(jì)數(shù)器或迭代器的情況下,遍歷循環(huán)中的每個(gè)元素。下面是示例代碼:
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
? ? System.out.println(number);
}
這段代碼將創(chuàng)建一個(gè)整數(shù)數(shù)組,然后使用增強(qiáng) for 循環(huán)遍歷該數(shù)組。在每個(gè)循環(huán)迭代中,增強(qiáng) for 循環(huán)將從數(shù)組中取出一個(gè)元素,并將其存儲(chǔ)在名為 number?的變量中。
其實(shí)增強(qiáng)for循環(huán)的底層就是迭代器,是我們?yōu)榱撕?jiǎn)化迭代器的代碼書寫而創(chuàng)造出來(lái)的。?
Java 中的增強(qiáng) for 循環(huán)可以用于遍歷任何實(shí)現(xiàn)了 Iterable? 接口的集合對(duì)象。
案例:
List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));
for (String name : names) {
? ? System.out.println(name);
}
這段代碼將創(chuàng)建一個(gè)字符串列表,并使用增強(qiáng) for 循環(huán)遍歷該列表中的每個(gè)元素。
需要注意的是,增強(qiáng) for 循環(huán)僅用于遍歷操作,它并不能用于修改集合中的元素。如果需要在循環(huán)中修改集合中的元素,應(yīng)使用傳統(tǒng)的 `for` 循環(huán)或迭代器進(jìn)行遍歷。
增強(qiáng)for循環(huán)的特點(diǎn):
1. 簡(jiǎn)潔易讀:增強(qiáng) for 循環(huán)可以讓代碼更加簡(jiǎn)潔易讀,特別是在遍歷數(shù)組或集合等容器類型時(shí),可以省略掉繁瑣的索引或迭代器等操作。
2. 安全性:增強(qiáng) for 循環(huán)是一種類型安全的循環(huán),即在編譯時(shí)就能夠檢查類型匹配,從而避免了運(yùn)行時(shí)的類型轉(zhuǎn)換錯(cuò)誤。
3. 效率低下:雖然增強(qiáng) for 循環(huán)簡(jiǎn)潔易讀,但在一些性能要求較高的場(chǎng)景下,它的效率可能會(huì)比傳統(tǒng)的 for 循環(huán)或迭代器遍歷低下。這是因?yàn)樵鰪?qiáng) for 循環(huán)需要在每次循環(huán)迭代中執(zhí)行一次數(shù)組或集合對(duì)象的訪問(wèn)操作,造成了一些額外的性能損失。
總的來(lái)說(shuō),增強(qiáng) for 循環(huán)適用于那些簡(jiǎn)單的遍歷操作,可以提高代碼可讀性和維護(hù)性。但對(duì)于復(fù)雜的遍歷場(chǎng)景,應(yīng)使用傳統(tǒng)的 for 循環(huán)或迭代器來(lái)實(shí)現(xiàn)遍歷。
lambda方法遍歷:?
Lambda 是 Java 8 引入的一個(gè)新特性,它可以簡(jiǎn)化對(duì)匿名類的使用,使得代碼更加簡(jiǎn)潔易讀。Lambda 表達(dá)式可以傳遞為方法參數(shù),類似于傳遞一個(gè)函數(shù)或代碼塊,可以大幅度減少代碼和 API 的復(fù)雜性。下面是一個(gè) Lambda 的示例代碼:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
list.forEach((n) -> System.out.println(n));
這段代碼將創(chuàng)建一個(gè)整數(shù)列表,然后使用 forEach?方法遍歷該列表并打印出每個(gè)元素。在這里,我們使用了一個(gè) Lambda 表達(dá)式 (n) -> System.out.println(n)?來(lái)作為 forEach 方法的參數(shù),其中 `(n)` 是 Lambda 表達(dá)式的形參列表,`->` 是 Lambda 運(yùn)算符,而 `System.out.println(n)` 則是 Lambda 表達(dá)式的函數(shù)體。
在這個(gè)例子中,Lambda 表達(dá)式可以理解為一個(gè)簡(jiǎn)單的匿名函數(shù),接受一個(gè)整數(shù)參數(shù) `n` 并將其打印出來(lái)。與傳統(tǒng)的匿名類相比,使用 Lambda 表達(dá)式可以讓代碼更加簡(jiǎn)潔明了,同時(shí)避免了創(chuàng)建額外的匿名類對(duì)象帶來(lái)的性能和內(nèi)存開銷。
除了 forEach 方法,Lambda 表達(dá)式還可以用于任何接受函數(shù)式接口作為參數(shù)的方法,例如:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().mapToInt(n -> n).sum();
System.out.println(sum);
這段代碼使用了 Java 8 的流式 API,將整數(shù)列表轉(zhuǎn)換為流并調(diào)用 `mapToInt` 方法將每個(gè)元素轉(zhuǎn)換為整數(shù)類型并求和。在這里,`(n -> n)` 代表了一個(gè)簡(jiǎn)單的 Lambda 表達(dá)式,接受一個(gè)整數(shù)參數(shù)并返回其本身。
Lambda 表達(dá)式的特點(diǎn):
1. 簡(jiǎn)潔易讀:Lambda 表達(dá)式可以顯著地簡(jiǎn)化匿名類的語(yǔ)法,使得代碼更加簡(jiǎn)潔易讀。
2. 傳遞行為:Lambda 表達(dá)式可以看作是傳遞行為的一種方式,它可以作為方法參數(shù)傳遞,從而提供了一種靈活的、可重用的代碼塊。
3. 高效性:Lambda 表達(dá)式可以提高代碼的效率和性能,尤其是在并發(fā)或集合處理等場(chǎng)景下,可以節(jié)省時(shí)間和內(nèi)存開銷。
4. 類型推導(dǎo):Java 8 引入的類型推導(dǎo)機(jī)制使得 Lambda 表達(dá)式可以在某些情況下省略參數(shù)類型,并減少代碼冗余。
5. 閉包和變量捕獲:Lambda 表達(dá)式可以捕獲代碼塊內(nèi)的變量,從而形成閉包。這使得 Lambda 表達(dá)式可以訪問(wèn)局部變量和對(duì)象字段等狀態(tài),從而實(shí)現(xiàn)更加靈活和功能強(qiáng)大的行為。
總之,Java 中的 Lambda 表達(dá)式是一種便捷、高效、靈活的編程方式,可以在很多場(chǎng)景下實(shí)現(xiàn)代碼重用和靈活組合。它的使用可以提高代碼的可讀性和維護(hù)性,同時(shí)也可以降低代碼的復(fù)雜性和錯(cuò)誤率。
總結(jié):
? ? ? ? 我們必須掌握前兩種對(duì)單列集合的遍歷,最后一個(gè)lambda可以選擇性的掌握,單列集合的遍歷方法還有很多,我們?cè)谶@里只是給大家介紹了幾個(gè)最常用的遍歷方式。
如果我的內(nèi)容對(duì)你有幫助,請(qǐng)點(diǎn)贊,評(píng)論,收藏。創(chuàng)作不易,大家的支持就是我堅(jiān)持下去的動(dòng)力!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-595132.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-595132.html
到了這里,關(guān)于【從零開始學(xué)JAVA | 第二十四篇】單列集合的遍歷的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!