Java 8|Stream 高級(jí)用法

前面幾篇文章簡(jiǎn)單介紹了 Stream 的用法弦追,今天整理一下部分高級(jí)用法毕骡。

方法引用

Lambda 表達(dá)式經(jīng)常會(huì)有如下的表達(dá)式驴娃,只有一條語(yǔ)句奏候,返回某個(gè)方法的執(zhí)行結(jié)果。

string -> string.toUpperCase()

Java 8 為這種類(lèi)型的語(yǔ)句提供了一個(gè)簡(jiǎn)單的寫(xiě)法唇敞,也就是方法引用蔗草,可以重寫(xiě)為如下的方法引用。

String::toUpperCase

方法引用的標(biāo)準(zhǔn)寫(xiě)法為 ClassName::methodName疆柔,后面不需要加括號(hào)蕉世。方法引用和 lambda 表達(dá)式等價(jià),因此可以用 lambda 表達(dá)式的地方都可以用方法引用婆硬。

同樣地,構(gòu)造函數(shù)也可以使用方法引用奸例,如下的 lambda 表達(dá)式

text -> new String(text)

可以使用方法引用重寫(xiě)為

String::new

要想理解清楚方法引用彬犯,就必須明白這里是一種函數(shù)式的編程方法。使用 lambda 表達(dá)式的地方并沒(méi)有立即執(zhí)行查吊,而是在需要的時(shí)候才執(zhí)行谐区。

元素順序

元素在 Stream 中一定是有順序的,但未必與集合中的順序一致逻卖。如果是 List 集合宋列,Stream 在處理的時(shí)候會(huì)保持元素順序不變。如果是 Map评也、Set 集合炼杖,集合本身對(duì)元素的順序要求不嚴(yán)格,Stream 在處理的時(shí)候不會(huì)保證元素順序盗迟。

并行處理

現(xiàn)代計(jì)算機(jī)單核處理能力已經(jīng)很難再繼續(xù)提高坤邪,更傾向于往多核方向發(fā)展。Stream 為我們提供了利用多核計(jì)算能力的方法罚缕,可以并行處理流中的數(shù)據(jù)艇纺,提高大數(shù)據(jù)量的處理速度。

在 Stream 中邮弹,使用并行處理很簡(jiǎn)單黔衡。調(diào)用 Stream 的 parallel 方法或者集合的 parallelStream 方法可以得到一個(gè)并行處理的 Stream,其他的方法調(diào)用和操作不用改變腌乡。Stream 為我們屏蔽了并行的底層操作盟劫。

Stream<String> stream = Stream.of("a","b","c");
List<String> upperList = stream.parallel()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

List<Integer> list = Arrays.asList(1,2,3,4,5);
List<Integer> res = list.parallelStream()
    .filter(value -> value > 2)
    .collect(Collectors.toList());

并行處理數(shù)組

Java 8 還為數(shù)組提供了并行處理的方法,這些方法加在 Arrays 工具類(lèi)上导饲。方法列表如下:
Arrays.parallelPrefix:任意給定一個(gè)函數(shù)捞高,計(jì)算數(shù)組的和氯材;
Arrays.parallelSetAll:使用 Lambda 表達(dá)式更新數(shù)組元素;
Arrays.parallelSort:數(shù)組排序硝岗。

下面演示一下如何使用這些方法氢哮。在下面的代碼中,先用 parallelSetAll 方法初始化數(shù)組型檀,填充隨機(jī)數(shù)冗尤;然后調(diào)用 parallelSort 方法并行排序;最后調(diào)用 parallelPrefix 方法胀溺,使用 Integer::sum 方法引用裂七,計(jì)算出數(shù)組的和。

int[] array = new int[10];
//初始化
Arrays.parallelSetAll(array, i -> new Random().nextInt(100));
System.out.println(Arrays.toString(array));
//排序
Arrays.parallelSort(array);
System.out.println(Arrays.toString(array));
//累加
Arrays.parallelPrefix(array, Integer::sum);
System.out.println(Arrays.toString(array));

上述代碼的一次運(yùn)行結(jié)果如下仓坞,填充隨機(jī)數(shù)背零、排序和求和的結(jié)果符合預(yù)期。

[77, 27, 94, 95, 11, 30, 46, 96, 45, 17]
[11, 17, 27, 30, 45, 46, 77, 94, 95, 96]
[11, 28, 55, 85, 130, 176, 253, 347, 442, 538]

每周 3 篇學(xué)習(xí)筆記或技術(shù)總結(jié)无埃,面向有一定基礎(chǔ)的 Java 程序員徙瓶,內(nèi)容涉及 Java 進(jìn)階、虛擬機(jī)嫉称、MySQL侦镇、NoSQL、分布式計(jì)算织阅、開(kāi)源框架等多個(gè)領(lǐng)域壳繁。關(guān)注作者或微信公眾號(hào) 后端開(kāi)發(fā)那點(diǎn)事兒 第一時(shí)間獲取最新內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荔棉,一起剝皮案震驚了整個(gè)濱河市闹炉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌润樱,老刑警劉巖剩胁,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異祥国,居然都是意外死亡昵观,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)舌稀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)啊犬,“玉大人,你說(shuō)我怎么就攤上這事壁查【踔粒” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵睡腿,是天一觀的道長(zhǎng)语御。 經(jīng)常有香客問(wèn)我峻贮,道長(zhǎng),這世上最難降的妖魔是什么应闯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任纤控,我火速辦了婚禮,結(jié)果婚禮上碉纺,老公的妹妹穿的比我還像新娘船万。我一直安慰自己,他們只是感情好骨田,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布耿导。 她就那樣靜靜地躺著,像睡著了一般态贤。 火紅的嫁衣襯著肌膚如雪舱呻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天悠汽,我揣著相機(jī)與錄音狮荔,去河邊找鬼。 笑死介粘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晚树。 我是一名探鬼主播姻采,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爵憎!你這毒婦竟也來(lái)了慨亲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宝鼓,失蹤者是張志新(化名)和其女友劉穎刑棵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體愚铡,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛉签,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沥寥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍舍。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邑雅,靈堂內(nèi)的尸體忽然破棺而出片橡,到底是詐尸還是另有隱情,我是刑警寧澤淮野,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布捧书,位于F島的核電站吹泡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏经瓷。R本人自食惡果不足惜爆哑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望了嚎。 院中可真熱鬧泪漂,春花似錦、人聲如沸歪泳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呐伞。三九已至敌卓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伶氢,已是汗流浹背趟径。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工矛纹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棘伴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓奏赘,卻偏偏與公主長(zhǎng)得像蕾盯,于是被迫代替她去往敵國(guó)和親幕屹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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