Java Stream流處理

應(yīng)用場(chǎng)景:需要對(duì)集合內(nèi)的元素進(jìn)行從頭到尾的遍歷操作時(shí)可以考慮使用

不可變的List集合

不可變集合指的是一旦創(chuàng)建扣甲,就無(wú)法修改,只能進(jìn)行查詢(xún)齿椅,在Java中可以使用以下方式構(gòu)建

List<String> list = List.of("A", "B", "C");
// list.add("D"); 會(huì)報(bào)錯(cuò)
// list.remove("A"); 也會(huì)報(bào)錯(cuò)

Set<String> set = Set.of("A", "B", "C");

對(duì)于雙列集合Map來(lái)說(shuō)琉挖,Map.of()方法最多容納10組鍵值對(duì),有上限涣脚,但是list和set沒(méi)有

//自動(dòng)兩兩一組k-v
//1-A
//2-B
//3-C
Map<String, String> map = Map.of("1", "A", "2", "B", "3", "C");
// 補(bǔ)充兩種map集合遍歷的方法
// 第一種是用獲取keyset后遍歷
Set<String> keyset = map.KeySet();
for(String key:keyset){
    System.out.println(map.get(key));
}
// 第二種是獲得entity集合后遍歷
// map中的每一個(gè)元素就是一個(gè)Entity對(duì)象
Set<Map.Entity<String, String>> entitySet = map.entitySet();
for(Map.Entity<String, String> entity:entitySet){
    System.out.println(entity.getKey()+entity.getValue());
}

無(wú)限制的不可變map集合創(chuàng)建使用ofEntries()示辈、copyOf()

HashMap<String, String> hm = new HashMap<>();
// 持續(xù)插入
hm.put("張三", "南京");
…
//copyOf()方法直接接收一個(gè)map對(duì)象作為參數(shù),生成一個(gè)不可變的map集合對(duì)象
Map<String, String> map = Map.copyOf(hm);
//ofEntities()方法接收一個(gè)`Map.Entity`類(lèi)型的數(shù)組作為參數(shù)
// 首先要把hm轉(zhuǎn)換為數(shù)組遣蚀,采用toArray()方法
Map.Entity<String,String> entities = hm.entitySet();
Map map = Map.ofEntities(entities.toArray(new Map.Entity[0]));

集合的toArray()toArray(T[] a)方法:
toArray()方法返回一個(gè)Object[]類(lèi)型的數(shù)組
toArray(T[] a)方法返回一個(gè)T[]類(lèi)型的數(shù)組:
如果傳入的數(shù)組a的長(zhǎng)度小于List中元素的個(gè)數(shù)顽耳,那么toArray(T[] a)方法會(huì)新建一個(gè)T[]類(lèi)型的數(shù)組,長(zhǎng)度為L(zhǎng)ist中元素的個(gè)數(shù)妙同,然后將List中的元素復(fù)制到新建的數(shù)組中射富。
如果傳入的數(shù)組a的長(zhǎng)度大于等于List中元素的個(gè)數(shù),那么toArray(T[] a)方法會(huì)將List中的元素復(fù)制到傳入的數(shù)組a中粥帚,然后返回傳入的數(shù)組a胰耗。
toArray()方法的實(shí)現(xiàn)就是調(diào)用toArray(new Object[0])方法。

結(jié)合lambda表達(dá)式芒涡,簡(jiǎn)化集合柴灯、數(shù)組整體的需要遍歷到底的操作。

  1. 先得到一條stream流水線(xiàn)费尽,并把數(shù)據(jù)放上去
  2. 然后調(diào)用中間方法
  3. 最后以終結(jié)方法結(jié)束

在這個(gè)過(guò)程中赠群,lambda表達(dá)式里面出現(xiàn)的變量指的就是集合中的元素

生成數(shù)據(jù)流的方法

  • 單列集合可以直接使用stream()方法
  • 雙列集合獲取entrySet
//map沒(méi)有valueSet!
Stream<String> stream = hm.values().stream();
Stream<String> keyStream = hm.keySet().stream();
Stream<Map.Entry<String, String>> entryStream = hm.entrySet().stream();
  • 數(shù)組類(lèi)型使用Arrays.stream(arr)生成流
int[] arr = new int[5];
IntStream intStream = Arrays.stream(arr);

中間方法

中間方法

流只能使用一次旱幼,所以要采用鏈?zhǔn)骄幊痰姆椒ú槊瑁词故前阎虚g流通過(guò)變量保存,使用完一次后再利用也會(huì)報(bào)錯(cuò)

Stream<Integer> stream1 = list.stream();
//這一步stream1已經(jīng)被使用
Stream<Integer> stream2 = stream1.filter(n -> n == 3);
stream2.forEach(System.out::println);
//下面語(yǔ)句報(bào)錯(cuò): Stream has already been linked or consumed 
Stream<Integer> stream3 = stream1.filter(n -> n == 4);

刷算法題常用mapToInt()方法柏卤,它通常用于將一個(gè)對(duì)象流(Stream<T>)轉(zhuǎn)換為一個(gè)原始整數(shù)流(IntStream

終結(jié)方法

終結(jié)方法

收集到數(shù)組

mapToInt()返回 IntStream
map() 返回 Stream
IntStream可以使用sum() min() max() average()等方法

//toArray無(wú)參情況
Object[] array = list.stream().toArray();
//給toArray()參數(shù)
//這里因?yàn)橛玫氖欠盒投砸彩遣豢梢灾苯邮褂胣ew int[]的
//這里的value就是list的size
Integer[] array1 = list.stream().toArray(value -> new Integer[value]);      
//想要變成int數(shù)組
int[] array2 = list.stream().mapToInt(Integer::intValue).toArray();

收集到集合List/Set

使用Collectors工具類(lèi)中的toList()``toSet()方法

Set<Integer> collect = list.stream().collect(Collectors.toSet());

收集到Map

使用Collectors工具類(lèi)中的toMap()方法

List<String> list2 = new ArrayList<>();
list2.add("hwh-23");
Map<String, Integer> collect1 = list2.stream().collect(Collectors.toMap(s -> s.split("-")[0],
                s -> Integer.parseInt(s.split("-")[1])));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缘缚,隨后出現(xiàn)的幾起案子勾笆,更是在濱河造成了極大的恐慌,老刑警劉巖桥滨,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窝爪,死亡現(xiàn)場(chǎng)離奇詭異弛车,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蒲每,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)帅韧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人啃勉,你說(shuō)我怎么就攤上這事忽舟。” “怎么了淮阐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵叮阅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我泣特,道長(zhǎng)浩姥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任状您,我火速辦了婚禮勒叠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膏孟。我一直安慰自己眯分,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布柒桑。 她就那樣靜靜地躺著弊决,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魁淳。 梳的紋絲不亂的頭發(fā)上飘诗,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音界逛,去河邊找鬼昆稿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛息拜,可吹牛的內(nèi)容都是我干的溉潭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼该溯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岛抄!你這毒婦竟也來(lái)了别惦?” 一聲冷哼從身側(cè)響起狈茉,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掸掸,沒(méi)想到半個(gè)月后氯庆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蹭秋,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年堤撵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仁讨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡实昨,死狀恐怖洞豁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荒给,我是刑警寧澤丈挟,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站志电,受9級(jí)特大地震影響曙咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挑辆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一例朱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鱼蝉,春花似錦洒嗤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吉挣,卻和暖如春派撕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睬魂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工终吼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氯哮。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓际跪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親喉钢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子姆打,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在Java 8中,引入了一種新的處理集合數(shù)據(jù)的方式——Stream肠虽。Stream可以讓我們更方便地對(duì)集合數(shù)據(jù)進(jìn)行處...
    ziylin閱讀 189評(píng)論 0 0
  • 上一篇文章大致講解了下Java基礎(chǔ)--集合幔戏,這次對(duì)于上一篇的一個(gè)衍生,講解下最新Java8中對(duì)于集合的一個(gè)優(yōu)化及使...
    出門(mén)變浪人閱讀 907評(píng)論 2 1
  • 兩個(gè)星期以前痊剖,就有讀者強(qiáng)烈要求我寫(xiě)一篇 Java Stream 流的文章,我說(shuō)市面上不是已經(jīng)有很多了嗎垒玲,結(jié)果你猜他...
    Java__JJ閱讀 160評(píng)論 0 0
  • Java流庫(kù)(java.util.stream) 流提供了一種讓我們可以在比集合更高的概念級(jí)別上指定計(jì)算的數(shù)據(jù)視圖...
    thorhill閱讀 4,840評(píng)論 0 4
  • 1.概論 流提供了一種讓我們可以在比集合更高的概念級(jí)別上指定計(jì)算的數(shù)據(jù)視圖陆馁。通過(guò)使用流,我們可以說(shuō)明想要完成什么任...
    黔語(yǔ)閱讀 225評(píng)論 0 0