java 8 新特性 stream

之前寫代碼一直用for循環(huán)以及if判斷來處理大部分內(nèi)容无拗,正可謂屢試不爽梁只,但是后面看到大佬們寫的代碼挫鸽,用到了java8新特性lambda表達(dá)式说敏、stream流操作處理集合,剛開始閱讀代碼時(shí)由于不太了解丢郊,看不懂做了什么操作像云,一大串代碼結(jié)束就解決了很多問題,代碼很簡潔很規(guī)范蚂夕。再反過來看看for循環(huán)和各種if判斷迅诬,雖然很親和,很易懂婿牍,但是代碼量絕對(duì)的充實(shí)侈贷,并且有時(shí)候在一個(gè)方法中頻繁的使用for循環(huán)和if判斷,雖然自己寫的明明白白等脂,但是讀者看得腦闊疼俏蛮,后面自己也慢慢的開始使用stream來處理一些代碼,往往五六行代碼的for循環(huán)和if判斷使用用stream處理一行代碼就搞定了上遥,下面總結(jié)一下有關(guān)java8 新特性stream的語法搏屑。

stream簡單介紹

Java 8 中的 Stream 是對(duì)集合(Collection)對(duì)象功能的增強(qiáng),它專注于對(duì)集合對(duì)象進(jìn)行各種非常便利粉楚、高效的聚合操作(aggregate operation)辣恋,或者大批量數(shù)據(jù)操作 (bulk data operation)。Stream API 借助于同樣新出現(xiàn)的 Lambda 表達(dá)式模软,極大的提高編程效率和程序可讀性伟骨。同時(shí)它提供串行和并行兩種模式進(jìn)行匯聚操作,并發(fā)模式能夠充分利用多核處理器的優(yōu)勢(shì)

語法

1燃异、distinct 去重

distinct方法是對(duì)stream流中包含的元素進(jìn)行去重携狭,生成新的stream

List<String> list = Arrays.asList("悟空","巨無霸","擎天柱","悟空","大黃蜂");
//去重后轉(zhuǎn)化為list集合
list = list.stream().distinct().collect(Collectors.toList());
//利用forech循環(huán)輸出集合元素
list.forEach(System.out::println);
2、filter 過濾

filter方法是根據(jù)設(shè)置的條件來過濾回俐、篩選出所需要的元素

 List<String> list = Arrays.asList("","","擎天柱","","大黃蜂");
 //過濾掉空字符串
 List<String> filterList = list.stream().filter(str -> !"".equals(str)).collect(Collectors.toList());
 //獲取不為空字符串的數(shù)量
 Long count = list.stream().filter(str -> !"".equals(str)).count();

3逛腿、map 根據(jù)指定的函數(shù)進(jìn)行轉(zhuǎn)化

map方法是對(duì)于Stream中包含的元素使用給定的轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換操作稀并,新生成的Stream只包含轉(zhuǎn)換生成的元素

List<Integer> integerList = Arrays.asList(10, 20, null, 30, 40, 50);
//獲取不為空的元素、對(duì)每個(gè)元素乘以2
integerList = integerList.stream().filter(x -> x != null).map(x -> x * 2).collect(Collectors.toList());
List<String> mapList = Arrays.asList("a","B", "C","qwer");
//將集合中的所有字符串元素轉(zhuǎn)化成大寫的字符串輸入
mapList.stream().map( x -> x.toUpperCase()).collect(Collectors.toList()).forEach(System.out::println);

4单默、limit 獲取指定數(shù)量的元素

limit方法是根據(jù)設(shè)定的數(shù)量從流中獲取對(duì)應(yīng)數(shù)量的元素

 List<String> list = Arrays.asList("巨無霸","霸天虎","擎天柱","悟空","大黃蜂");
//獲取集合中的前三個(gè)字符串
List<String> limitList = list.stream().limit(3).collect(Collectors.toList());
limitList.forEach(System.out::println);
5碘举、skip 獲取去除指定數(shù)量之后的元素

skip方法與limt有點(diǎn)區(qū)別,此方法是獲取到根據(jù)設(shè)定的數(shù)量n去除掉集合中前n個(gè)元素之后的所有數(shù)據(jù)

List<String> list = Arrays.asList("巨無霸","霸天虎","擎天柱","悟空","大黃蜂");
//獲取到去除集合中前三個(gè)字符串之后的所有字符串
List<String> skipList = list.stream().skip(3).collect(Collectors.toList());
skipList.forEach(System.out::println);
6雕凹、 sorted 排序

sorted方法是對(duì)流中的元素進(jìn)行排序殴俱,降序和升序都可以使用自然排序的方法政冻,也可以調(diào)用Comparator中的方法進(jìn)行排序

List<Integer> sortList = Arrays.asList(10, 40, 30, 50, 60);
//對(duì)集合中的元素進(jìn)行升序排序
List<Integer> ascSortList  = sortList.stream().sorted().collect(Collectors.toList());
//使用Comparator提供的comparing進(jìn)行升序排序
List<Integer> ascSortLists = sortList.stream().sorted(Comparator.comparing(x -> x )).collect(Collectors.toList());
//對(duì)集合中的元素進(jìn)行倒序排序
List<Integer> descSortList = sortList.stream().sorted((x1, x2) -> x2.compareTo(x1)).collect(Collectors.toList());
//使用Comparator 提供的reverseOrder() 方法進(jìn)行倒序排序
List<Integer> descSortLists = sortList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());

7枚抵、peek

peek 方法是生成一個(gè)包含原Stream的所有元素的新Stream,同時(shí)會(huì)提供一個(gè)消費(fèi)函數(shù)(Consumer實(shí)例)明场,新Stream每個(gè)元素被消費(fèi)的時(shí)候都會(huì)執(zhí)行給定的消費(fèi)函數(shù)
:剛開始以為peek與map的用法一樣汽摹,后面通過學(xué)習(xí)及練習(xí),peek方法其實(shí)是沒有返回值的苦锨,多半用于一些輸出逼泣,數(shù)據(jù)的校驗(yàn)等

 List<Integer> peekList = Arrays.asList(10, 40, 30, 50, 60);
//打印集合中的元素
List<Integer> peekLists = peekList.stream().peek(System.out::println).collect(Collectors.toList());
//判斷集合中是否有等于30的元素,并且獲取前三個(gè)元素之后的所有元素
List<Integer> peekList1 = peekList.stream().peek(x -> {
    if (x == 30) {
        System.out.println("集合中有30");
    }
}).skip(3).collect(Collectors.toList());
peekList1.forEach(System.out::println); 

一個(gè)總結(jié)例子使用以上的所有方法

//需求:給定一個(gè)Integer類型的List舟舒,通過各種處理獲取最終的一個(gè)集合
       // 1拉庶、過濾掉null
       // 2、去重
       // 3秃励、每個(gè)元素乘以2
       // 4氏仗、每個(gè)元素被消費(fèi)的時(shí)候打印自身
       // 5、跳過前三個(gè)元素
       // 6夺鲜、獲取剩下元素中的前五個(gè)元素
       // 7皆尔、倒序排序
       Integer[] integersArr = new Integer[]{1, 2, null, 2, 3, 4, null, 5, 6, 7, 8, 9, 10};
       List<Integer> integerList = Arrays.asList(integersArr);
       integerList = integerList.stream().
               filter(x -> x != null).
               distinct().
               map(x -> x * 2).
               peek(System.out::println).
               skip(3).
               limit(5).
               sorted(Comparator.reverseOrder()).
               collect(Collectors.toList());
       integerList.forEach(num -> System.out.print(num + ", "));

結(jié)果:

image.png

參考鏈接:https://www.cnblogs.com/song27/p/7697713.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市币励,隨后出現(xiàn)的幾起案子慷蠕,更是在濱河造成了極大的恐慌,老刑警劉巖食呻,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流炕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仅胞,警方通過查閱死者的電腦和手機(jī)浪感,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饼问,“玉大人影兽,你說我怎么就攤上這事±掣铮” “怎么了峻堰?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵讹开,是天一觀的道長。 經(jīng)常有香客問我捐名,道長旦万,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任镶蹋,我火速辦了婚禮成艘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贺归。我一直安慰自己淆两,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布拂酣。 她就那樣靜靜地躺著秋冰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪婶熬。 梳的紋絲不亂的頭發(fā)上剑勾,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音赵颅,去河邊找鬼虽另。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饺谬,可吹牛的內(nèi)容都是我干的捂刺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼商蕴,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼叠萍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绪商,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤苛谷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后格郁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腹殿,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年例书,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锣尉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡决采,死狀恐怖自沧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤拇厢,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布爱谁,位于F島的核電站,受9級(jí)特大地震影響孝偎,放射性物質(zhì)發(fā)生泄漏访敌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一衣盾、第九天 我趴在偏房一處隱蔽的房頂上張望寺旺。 院中可真熱鬧,春花似錦势决、人聲如沸阻塑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叮姑。三九已至唉地,卻和暖如春据悔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耘沼。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工极颓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人群嗤。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓菠隆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狂秘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骇径,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348