成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

何時使用Java Stream,何時使用Java集合框架

開發(fā) 后端
Java 8 的Stream API 提供了不少可替代Java 集合框架的操作。但是不少同學(xué)在學(xué)習(xí)和使用Stream時依然感到很困惑,不知道何時使用Stream,甚至想不起來使用Stream,甚至在Stream和集合框架的選擇上也成了問題。今天胖哥將嘗試幫你解決這些疑問。

[[392376]]

本文轉(zhuǎn)載自微信公眾號「碼農(nóng)小胖哥」,作者碼農(nóng)小胖哥 。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)小胖哥公眾號。

Java 8 的Stream API 提供了不少可替代Java 集合框架的操作。但是不少同學(xué)在學(xué)習(xí)和使用Stream時依然感到很困惑,不知道何時使用Stream,甚至想不起來使用Stream,甚至在Stream和集合框架的選擇上也成了問題。今天胖哥將嘗試幫你解決這些疑問。

本文已經(jīng)假設(shè)你入門過了Stream,你也可以通過這一篇來入門學(xué)習(xí)。

Stream的特點

如果你要用好Stream,你必須搞清楚它的特點。

Stream 并非數(shù)據(jù)結(jié)構(gòu)

雖然我們把Stream和以Collection為代表的集合框架類型放在一起對比,但它只是將數(shù)據(jù)源(Source)中的數(shù)據(jù)元素提取到數(shù)據(jù)操作管道,并按照定義好的規(guī)則(操作符)進(jìn)行“流動”。另外Stream也絕不修改自己所封裝的底層數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)。

Stream有點類似于水管網(wǎng)絡(luò)。

無固定大小

水管網(wǎng)絡(luò)中流動的水是沒有固定大小的,甚至可以是無限的。Stream也是如此。

惰性化

Stream只有定義終止操作,比如collect(Collector)、forEach(Consumer),它才會開始執(zhí)行。以下從流中篩選以h開頭的字符串并不會執(zhí)行。

  1. Stream.of("hello","wolrd").filter(str-> str.startsWith("h")) 

不變性

一個既定的Stream是不變的,所有的中間操作都會衍生一個新的Stream,即使中間操作不改變Stream中的任何元素。

一次性

一個Stream流只有一次終止操作。一旦完成了終止操作,這個流就關(guān)閉了。無法再次進(jìn)行使用,簡直就是一次性用品。

  1. Stream<String> stringStream = Stream.of("1""2"); 
  2. // forEach 終止操作打印 1  2 流終止 
  3. stringStream.forEach(System.out::println); 
  4. // 重復(fù)使用將拋出IllegalStateException異常 stream has already been operated upon or closed 
  5. stringStream.filter(s -> s.equals("2")).forEach(System.out::println); 

并行操作

Stream支持并行化(parallel)操作,不需要編寫額外的多線程代碼,所有的操作會自動并行進(jìn)行。不過大多數(shù)情況下我們都是串行執(zhí)行。

我們該如何選擇

對于Stream和Collection我們該如何選擇呢?首先Collection的絕大部分場景Stream都可以完成,甚至更好。

看API操作

它們都提供了很多方法,如果你需要獲取元素的個數(shù),集合更加方便一些,如果你要過濾一些元素,很明顯,Stream的API更加方便,甚至它提供了各種可組合的操作。

看初始化成本

對于集合,一旦定義使用需要一次性的加載入內(nèi)存,如果你打算在內(nèi)存中重用這些數(shù)據(jù),使用集合就非常合適;而Stream的惰性特點,在終端操作之前不會有任何的中間操作,這意味著不會上來就初始化數(shù)據(jù)到內(nèi)存,可以降低初始化成本,甚至你可以調(diào)整其執(zhí)行消費元素的速率。

看結(jié)果集大小

如果最終的結(jié)果是可控的、有限的,它們兩者都能夠勝任;如果結(jié)果集非常龐大或者近似無限的,Stream將是不二之選。

是否改變原始數(shù)據(jù)

Stream不會改變原始的數(shù)據(jù),而Collection可以實現(xiàn)這一點。

是要數(shù)據(jù)容器還是數(shù)據(jù)管道。

是否需要重用對象實例

當(dāng)結(jié)果以Collection的形式返回時,我們可以重復(fù)使用。而一個Stream被使用后,就認(rèn)為它已消耗掉,并在重用時拋出IllegalStateException,如上面所示。

是否需要固定的格式

Stream流的表現(xiàn)格式通常沒有Java集合框架豐富,Java集合框架提供了如Set、List、Map等格式。如果你需要終端返回展現(xiàn),顯然集合框架更加合適。

在Spring MVC中,Stream的展現(xiàn)為數(shù)組。

總結(jié)

以上是在使用這兩個概念需要考慮的幾個點,其實大多數(shù)情況下,我們只需要看誰的API更加友好,因為它們之間可以相互轉(zhuǎn)換。顯而易見,Stream更加符合未來的趨勢。

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2020-10-21 14:54:02

RustGolang開發(fā)

2011-08-08 15:43:01

MySQL索引

2021-11-26 09:00:00

數(shù)據(jù)庫數(shù)據(jù)集工具

2019-11-29 07:53:07

DNSTCP網(wǎng)絡(luò)協(xié)議

2020-12-13 14:32:22

5GWi-Fi 6

2021-12-09 09:52:36

云原生安全工具云安全

2013-08-21 15:06:31

iOSself.

2012-02-08 11:01:53

HibernateJava

2024-04-16 12:00:14

API系統(tǒng)

2024-08-01 10:10:24

MySQL場景搜索

2020-10-10 10:20:11

云計算云安全技術(shù)

2011-04-15 17:07:13

Java

2025-05-19 08:13:45

2021-06-01 11:11:26

物聯(lián)網(wǎng)互聯(lián)網(wǎng)IoT

2021-04-25 15:06:16

微軟虛擬桌面IT

2023-11-10 12:55:00

消息代理事件代理

2021-04-14 07:52:00

Vue 作用域插槽

2020-02-25 16:00:28

JavaScript數(shù)據(jù)技術(shù)

2018-12-12 09:59:47

微服務(wù)架構(gòu)分布式系統(tǒng)

2024-10-07 08:49:25

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩av一区二区在线观看 | 九色综合网 | 九九久久这里只有精品 | 在线一区视频 | www.日韩 | 中文字幕在线观看精品 | 久在线视频 | 成人在线视频免费观看 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 羞羞视频在线网站观看 | 操操操操操 | 国产高清在线精品一区二区三区 | 欧洲一区二区在线 | 日韩免费视频 | www.色.com| 亚洲一区毛片 | 欧美a级成人淫片免费看 | 欧美在线| 久久久涩 | 久久高清精品 | 亚洲一区亚洲二区 | 日韩在线免费播放 | 男女国产视频 | 午夜影院在线播放 | 在线一区视频 | 中文字幕三区 | 国产在线视频一区二区 | 日韩二三区 | 国产精彩视频在线观看 | 日韩在线一区二区三区 | 国产成人a亚洲精品 | 91在线精品一区二区 | 日韩中文字幕一区 | 欧美日日 | 色视频成人在线观看免 | 国产亚洲二区 | 成人不卡一区二区 | 久久夜视频 | 在线视频 亚洲 | 天天操夜夜骑 | 视频一二三区 |