日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

从数组到流再到Java 8

發(fā)布時(shí)間:2023/12/3 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从数组到流再到Java 8 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

不久前,我們將一些Eclipse插件項(xiàng)目升級(jí)到Java8。此后再也沒有回頭。 除其他事項(xiàng)外,使用lambda和streams API ,過濾,映射和查找集合中的元素變得更加容易和簡潔。 我想到目前為止,對(duì)于大多數(shù)人來說,什么都沒有。

但是許多現(xiàn)有的API在參數(shù)和/或返回?cái)?shù)組中使用數(shù)組。 例如,請(qǐng)考慮以下虛構(gòu)但通用的方法簽名:

String[] filterStrings( String... input );

隨之而來的是從數(shù)組中獲取流的額外工作,以便能夠優(yōu)雅地過濾,映射,縮小等元素。 然后取回一個(gè)可以傳遞給老式API的數(shù)組。

向前…

要從數(shù)組中獲取流,有很多選擇。 例如,這行代碼

Stream stream = Stream.of( "a", "b", "c" );

產(chǎn)生具有指定元素的流。 同樣可以通過以下方式實(shí)現(xiàn):

Stream stream = Arrays.stream( "a", "b", "c" );

實(shí)際上, Stream.of()使用Arrays.stream()完成任務(wù)。 通過列表繞行也會(huì)產(chǎn)生流:

Stream stream = Arrays.asList( "a", "b", "c" ).stream();

… 然后回來

一旦有了流,就可以使用所有流功能,例如,從字符串?dāng)?shù)組中過濾空字符串:

Stream.of( "a", "", "b", "", "c", "" ).filter( string -> !string.isEmpty() );

但是如何返回結(jié)果數(shù)組呢?

有用于集合和列表的收集器,但不包括用于簡單數(shù)組的收集器。 此代碼段

List<String> list= Stream.of( ... ).filter( ... ).collect( Collectors.toList() ); String[] array = list.toArray( new String[ list.size() ] );

使用toList()獲得過濾后的輸入的列表,然后在第二步中將該列表轉(zhuǎn)換為數(shù)組。

我?guī)缀跻獙?shí)現(xiàn)一個(gè)自定義數(shù)組收集器,以消除多余的步驟。 直到我發(fā)現(xiàn)有一個(gè)終端操作可以像這樣簡單地將流的結(jié)果捕獲到數(shù)組中:

String[] array = Stream.of( ... ).toArray( size -> new String[ size ] );

toArray()需要generator ,它是對(duì)能夠創(chuàng)建所請(qǐng)求大小的數(shù)組的方法的引用。 在這里創(chuàng)建一個(gè)String類型的數(shù)組。

但是,等等,還有一種更簡單的方法。 如上所述,生成器是可以創(chuàng)建所需大小的數(shù)組的函數(shù)。 Java 8的開發(fā)者非常善于引入一些語法糖來直接引用數(shù)組構(gòu)造函數(shù)。

通過在構(gòu)造函數(shù)引用中添加一個(gè)左,右方括號(hào),可以表示一個(gè)數(shù)組構(gòu)造器引用 ,例如Type[]::new. 。 因此,上面的代碼行可以這樣重寫:

String[] array = Stream.of( ... ).toArray( String[]::new );

編譯器將String[]::new表達(dá)式擴(kuò)展為size -> new String[ size ] 。 因此, 生成的字節(jié)碼與前一種方法相同 ,但是我發(fā)現(xiàn)后者更為簡潔。

而且,它消除了錯(cuò)誤的生成的數(shù)組大小,這是不可能的,但仍然是可能的錯(cuò)誤。 考慮一下:

String[] array = Stream.of( "a", "b", "c" ).toArray( size -> new String[ 1 ] );

創(chuàng)建的數(shù)組顯然太小。 它的實(shí)際大小(一個(gè))將永遠(yuǎn)無法容納這三個(gè)結(jié)果元素。 因此將以IllegalStateException結(jié)尾。 使用數(shù)組構(gòu)造函數(shù)引用時(shí),編譯器將確保創(chuàng)建適當(dāng)大小的數(shù)組。

當(dāng)然,還有一個(gè)通用的toArray()方法可返回一個(gè)Objects數(shù)組,如果結(jié)果數(shù)組的實(shí)際類型無關(guān)緊要,則可以使用該方法。

從數(shù)組到流再返回的結(jié)論

像我親愛的同事Ralf一樣 ,許多程序員更喜歡API接口中的集合而不是數(shù)組。 但是仍然有許多“老式” API要求您處理數(shù)組。 而且與API一樣,這些不會(huì)很快消失。

但是,無論您喜歡哪種方式,或者無論哪種方式都必須使用現(xiàn)有代碼,我都發(fā)現(xiàn)Java 8在兩個(gè)世界之間提供了一個(gè)不錯(cuò)的橋梁,這是一個(gè)好消息。

如果您有任何疑問,建議或想分享您在該領(lǐng)域的經(jīng)驗(yàn),請(qǐng)發(fā)表評(píng)論。

翻譯自: https://www.javacodegeeks.com/2015/11/from-arrays-to-streams-and-back-with-java-8.html

總結(jié)

以上是生活随笔為你收集整理的从数组到流再到Java 8的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。