欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談一下Java中集合的迭代方式

 更新時間:2023年04月06日 14:08:07   作者:CrazyDragon_King  
這篇文章主要介紹了淺談一下Java中集合的迭代方式,可以幫助我們學(xué)習(xí),理解函數(shù)式編程,需要的朋友可以參考下

集合的迭代

流使得程序員得以站在更高的抽象層次上對集合進行操作。

傳統(tǒng)的迭代方法

直接看代碼:

		List<Dog> dogs = new ArrayList<>();
		dogs.add(new Dog("大黃", 2));
		dogs.add(new Dog("小黑", 3));
		dogs.add(new Dog("小哈",1));
		
		//最原始的 for 循環(huán)
		for (int i = 0; i < dogs.size(); i++) {
			System.out.println(dogs.get(i));
		}
		//增強 for 循環(huán)
		for (Dog dog1 : dogs) {
			System.out.println(dog1);
		}
		//使用迭代器
		Iterator<Dog> it = dogs.iterator();
		while (it.hasNext()) {
			Dog dog2 = it.next();
			System.out.println(dog2);
		}

說明:
增強 for 循環(huán),只是一個語法糖(Syntax Sugar),它的本質(zhì)就是使用 迭代器進行迭代。所以在,增強 for 循環(huán)里面,無法修改集合。這里也可以使用 while 來迭代 ,但是 while 還沒有 for 循環(huán)方便呢。

Stream 和 Lambda 進行集合迭代

//使用 Stream 和 Lambda 表達式進行迭代
dogs.stream().forEach(System.out::println);

//只使用 Lambda 表達式進行迭代
dogs.forEach(System.out::println);

這樣看似乎是下面這個更簡單點,但是 Stream 的作用遠不止于此,它可以將多個操作,串聯(lián)起來,使用 鏈?zhǔn)骄幊痰姆椒?,實現(xiàn)很復(fù)雜的操作。下面這個只是使用 Lambda 進行遍歷操作而已。

流和集合

流(Stream)是一種內(nèi)部迭代方式,可以通過集合直接獲取到相應(yīng)的 流(Stream),例如:Stream<Dog> stream = dogs.stream();,當(dāng)然了也可以從流獲取集合 List<Dog> dogs = stream.collect(Collectors.toList());.。這里只是以 List 集合為例,Map 和 Set 也是可以的。準(zhǔn)確的說,流 開啟了操作集合的新的方法,使用函數(shù)式編程來重構(gòu)以前的代碼,也是非常的不錯的。

這個只舉一個簡單的例子:就可以看出使用 Stream 是多么的方便了。
有一個集合里面存儲了 數(shù)字和非數(shù)字字符串,現(xiàn)在想要求這些數(shù)字字符串的和:
“1” “2” “3” “a” “4” “5” “c” “6” “7” “8” “d” “9” "10"

方式一:推薦使用,采用函數(shù)式編程(鏈?zhǔn)骄幊蹋?/h4>
List<String> mixStr = new ArrayList<String>(Arrays.asList("1", "2", "3", "a", "4", "5", "c", "6", "7", "8", "d", "9", "10"));
int sumary = mixStr.
		stream().
		filter(s->s.matches("^[0-9]*$")).
		map(Integer::parseInt).
		reduce(0, (acc, e)->acc+e);
System.out.println("方式一(推薦):"+sumary);

//有時候,一行太長了,可以分開寫,這樣增加了可讀性。
sumary = mixStr.stream().filter(s->s.matches("^[0-9]*$")).map(Integer::parseInt).reduce(0, (acc, e)->acc+e);

方式二:不推薦使用,采用函數(shù)式編程(不使用鏈?zhǔn)骄幊蹋?/h4>
Stream<String> filter = mixStr.stream().filter(s->s.matches("^[0-9]*$"));
Stream<Integer> map = filter.map(Integer::parseInt);
Integer reduce = map.reduce(0, (acc, e)->acc+e);
System.out.println(""+reduce);
System.out.println("方式二(不推薦):"+reduce);

這樣做增加了很多繁瑣的步驟和臨時變量,這和函數(shù)式編程的思想是相反的,但是這樣可以幫助我們學(xué)習(xí),理解函數(shù)式編程。

方式三:傳統(tǒng)的集合操作

sumary = 0;
for (String s : mixStr) {
	if (s.matches("^[0-9]*$")) {
		sumary += Integer.parseInt(s);
	}
}
System.out.println("傳統(tǒng)的方式:"+sumary);

這樣看似乎,還是傳統(tǒng)的方式比較簡單,可能和這個例子有關(guān),但是仔細分析還是能看出流和集合操作的差異,在流中每一步都是明確的,而且每一步(中間操作,不是終結(jié)操作,這個可以自己了解)都是返回一個流,而集合卻將這些都耦合到一起了,所以很難修改,而流就很簡單了,替換一個中間步驟是很簡單的。
例如,只是將reduce過程去掉,換成 forEach 遍歷,這需要改變最后一個操作即可,是不是很方便。

//流的用處很多。
mixStr.stream().filter(s->s.matches("^[0-9]*$")).map(Integer::parseInt).forEach(System.out::print);

運行截圖:

在這里插入圖片描述

說明

這個主要是對集合的遍歷來說流的好處,并不是說流的(我也是才開始了解,并不是很深入,這里可能只是一條皮毛吧,希望大家喜歡。),如果感興趣可以參考相關(guān)的博客或者書籍,閱讀關(guān)于流的知識,可以說,流開啟了新的時代,正如開頭那句話所說的。

到此這篇關(guān)于淺談一下Java中集合的迭代方式的文章就介紹到這了,更多相關(guān)Java集合的迭代方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java的AQS基本原理詳細分析

    Java的AQS基本原理詳細分析

    這篇文章主要介紹了Java的AQS基本原理詳細分析,AQS是Abstract Queued Synchronizer的簡稱,AQS提供了一種實現(xiàn)阻塞鎖和一系列依賴FIFO等待隊列的同步器的框架,本文主要講解分析其基本原理,需要的朋友可以參考下
    2024-01-01
  • MyBatis中的表關(guān)聯(lián)查詢實現(xiàn)示例

    MyBatis中的表關(guān)聯(lián)查詢實現(xiàn)示例

    這篇文章主要介紹了MyBatis中的表關(guān)聯(lián)查詢實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 一篇文章帶你了解java接口與繼承

    一篇文章帶你了解java接口與繼承

    這篇文章主要介紹了Java接口和繼承操作,結(jié)合具體實例形式分析了Java接口和繼承與使用的相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下
    2021-08-08
  • MyBatis?insert實體如何返回主鍵

    MyBatis?insert實體如何返回主鍵

    這篇文章主要介紹了MyBatis?insert實體如何返回主鍵,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring Cloud Zuul自定義過濾器的實現(xiàn)

    Spring Cloud Zuul自定義過濾器的實現(xiàn)

    這篇文章主要介紹了自定義Spring Cloud Zuul過濾器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java實現(xiàn)坦克大戰(zhàn)小游戲

    java實現(xiàn)坦克大戰(zhàn)小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)坦克大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • java8日期工具類封裝的實戰(zhàn)記錄

    java8日期工具類封裝的實戰(zhàn)記錄

    java time包中的是類是不可變且線程安全的,新的時間及日期API位于java.time中,下面這篇文章主要給大家介紹了關(guān)于java8日期工具類封裝的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • mybatis動態(tài)sql之新增與更新方式

    mybatis動態(tài)sql之新增與更新方式

    這篇文章主要介紹了mybatis動態(tài)sql之新增與更新方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java 生成圖片驗證碼3種方法(字母、加減乘除、中文)

    Java 生成圖片驗證碼3種方法(字母、加減乘除、中文)

    這篇文章主要介紹了Java 生成圖片驗證碼3種方法(字母、加減乘除、中文),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Spring注解@Qualifier的使用&&與@Primary注解的不同

    Spring注解@Qualifier的使用&&與@Primary注解的不同

    今天帶你了解一下Spring框架中的@Qualifier?注解,它解決了哪些問題,以及如何使用它,我們還將了解它與?@Primary?注解的不同之處,感興趣的朋友跟隨小編一起看看吧
    2023-10-10

最新評論