最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

集合的迭代

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

傳統(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));
		}
		//增強(qiáng) 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);
		}

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

Stream 和 Lambda 進(jìn)行集合迭代

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

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

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

流和集合

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

這個(gè)只舉一個(gè)簡(jiǎn)單的例子:就可以看出使用 Stream 是多么的方便了。
有一個(gè)集合里面存儲(chǔ)了 數(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);

//有時(shí)候,一行太長(zhǎng)了,可以分開(kāi)寫,這樣增加了可讀性。
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í)變量,這和函數(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)的方式比較簡(jiǎn)單,可能和這個(gè)例子有關(guān),但是仔細(xì)分析還是能看出流和集合操作的差異,在流中每一步都是明確的,而且每一步(中間操作,不是終結(jié)操作,這個(gè)可以自己了解)都是返回一個(gè)流,而集合卻將這些都耦合到一起了,所以很難修改,而流就很簡(jiǎn)單了,替換一個(gè)中間步驟是很簡(jiǎn)單的。
例如,只是將reduce過(guò)程去掉,換成 forEach 遍歷,這需要改變最后一個(gè)操作即可,是不是很方便。

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

運(yùn)行截圖:

在這里插入圖片描述

說(shuō)明

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

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

相關(guān)文章

  • Java中的線程池ThreadPoolExecutor解析

    Java中的線程池ThreadPoolExecutor解析

    這篇文章主要介紹了Java中的線程池ThreadPoolExecutor解析,線程池,thread pool,是一種線程使用模式,線程池維護(hù)著多個(gè)線程,等待著監(jiān)督管理者分配可并發(fā)執(zhí)行的任務(wù),需要的朋友可以參考下
    2023-11-11
  • JavaWeb實(shí)現(xiàn)簡(jiǎn)單用戶發(fā)送郵件

    JavaWeb實(shí)現(xiàn)簡(jiǎn)單用戶發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)簡(jiǎn)單用戶發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot集成P6Spy實(shí)現(xiàn)SQL日志的記錄詳解

    SpringBoot集成P6Spy實(shí)現(xiàn)SQL日志的記錄詳解

    P6Spy是一個(gè)框架,它可以無(wú)縫地?cái)r截和記錄數(shù)據(jù)庫(kù)活動(dòng),而無(wú)需更改現(xiàn)有應(yīng)用程序的代碼。一般我們使用的比較多的是使用p6spy打印我們最后執(zhí)行的sql語(yǔ)句
    2022-11-11
  • Java?EasyExcel實(shí)現(xiàn)合并相同內(nèi)容單元格與動(dòng)態(tài)標(biāo)題功能

    Java?EasyExcel實(shí)現(xiàn)合并相同內(nèi)容單元格與動(dòng)態(tài)標(biāo)題功能

    這篇文章主要為大家詳細(xì)介紹了Java?EasyExcel如何實(shí)現(xiàn)合并相同內(nèi)容單元格與動(dòng)態(tài)標(biāo)題功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下
    2023-12-12
  • 解析Java格式字符串的使用

    解析Java格式字符串的使用

    本文通過(guò)實(shí)例給大家介紹了java格式字符串的使用,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-02-02
  • 配置IDEA中java項(xiàng)目配置swagger全過(guò)程

    配置IDEA中java項(xiàng)目配置swagger全過(guò)程

    這篇文章主要介紹了配置IDEA中java項(xiàng)目配置swagger全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 如何利用SpringAOP的返回通知處理數(shù)據(jù)加密返回

    如何利用SpringAOP的返回通知處理數(shù)據(jù)加密返回

    這篇文章主要介紹了如何利用SpringAOP的返回通知處理數(shù)據(jù)加密返回,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • java調(diào)用dll方法總結(jié)

    java調(diào)用dll方法總結(jié)

    本篇文章小編給大家整理了java調(diào)用dll的方法的總結(jié),有需要的朋友參考學(xué)下一下吧。
    2017-12-12
  • SpringBoot如何獲取當(dāng)前操作用戶的id/信息

    SpringBoot如何獲取當(dāng)前操作用戶的id/信息

    在一般性的基設(shè)需求中,有需要獲取當(dāng)前用戶操作記錄的情況,也就是說(shuō)我們需要記錄當(dāng)前用戶的信息,如:id、昵稱、賬號(hào)等信息,這篇文章主要介紹了SpringBoot獲取當(dāng)前操作用戶的id/信息,需要的朋友可以參考下
    2023-10-10
  • 不知道面試會(huì)不會(huì)問(wèn)Lambda怎么用(推薦)

    不知道面試會(huì)不會(huì)問(wèn)Lambda怎么用(推薦)

    這篇文章主要介紹了Lambda表達(dá)式用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

昌邑市| 淮阳县| 鄱阳县| 志丹县| 锦州市| 黑龙江省| 临湘市| 东乌珠穆沁旗| 万载县| 当阳市| 当阳市| 德昌县| 滦南县| 安溪县| 城步| 来凤县| 广饶县| 革吉县| 镇江市| 武城县| 青河县| 宝清县| 宁津县| 福州市| 曲阳县| 凉山| 固始县| 宿迁市| 伊金霍洛旗| 鄄城县| 增城市| 广水市| 永胜县| 顺昌县| 手游| 开远市| 墨江| 陆河县| 海林市| 渝北区| 衡东县|