java8 从数组获取流_从数组到流再到Java 8
java8 從數(shù)組獲取流
不久前,我們將一些Eclipse插件項(xiàng)目升級(jí)到Java8。此后再也沒(méi)有回頭。 除其他事項(xiàng)外,使用lambda和streams API ,過(guò)濾,映射和查找集合中的元素變得更加容易和簡(jiǎn)潔。 我想到目前為止,對(duì)于大多數(shù)人來(lái)說(shuō),什么都沒(méi)有。
但是許多現(xiàn)有的API在參數(shù)和/或返回?cái)?shù)組中使用數(shù)組。 例如,請(qǐng)考慮以下虛構(gòu)但通用的方法簽名:
String[] filterStrings( String... input );隨之而來(lái)的是從數(shù)組中獲取流的額外工作,以便能夠優(yōu)雅地過(guò)濾,映射,縮小等元素。 然后取回一個(gè)可以傳遞給老式API的數(shù)組。
向前…
要從數(shù)組中獲取流,有很多選擇。 例如,這行代碼
Stream stream = Stream.of( "a", "b", "c" );產(chǎn)生具有指定元素的流。 也可以通過(guò)以下方法實(shí)現(xiàn):
Stream stream = Arrays.stream( "a", "b", "c" );實(shí)際上, Stream.of()使用Arrays.stream()完成任務(wù)。 通過(guò)列表繞行也會(huì)產(chǎn)生流:
Stream stream = Arrays.asList( "a", "b", "c" ).stream();… 然后回來(lái)
一旦有了流,就可以使用所有流功能,例如,從字符串?dāng)?shù)組中過(guò)濾空字符串:
Stream.of( "a", "", "b", "", "c", "" ).filter( string -> !string.isEmpty() );但是如何返回結(jié)果數(shù)組呢?
有用于集合和列表的收集器,但不包括用于簡(jiǎn)單數(shù)組的收集器。 此代碼段
List<String> list= Stream.of( ... ).filter( ... ).collect( Collectors.toList() ); String[] array = list.toArray( new String[ list.size() ] );使用toList()獲得過(guò)濾后的輸入的列表,然后在第二步中將該列表轉(zhuǎn)換為數(shù)組。
我?guī)缀跻獙?shí)現(xiàn)一個(gè)自定義數(shù)組收集器,以消除多余的步驟。 直到我發(fā)現(xiàn)有一個(gè)終端操作可以像這樣簡(jiǎn)單地將流的結(jié)果捕獲到數(shù)組中:
String[] array = Stream.of( ... ).toArray( size -> new String[ size ] );toArray()需要一個(gè)generator ,它是對(duì)能夠創(chuàng)建所請(qǐng)求大小的數(shù)組的方法的引用。 這里創(chuàng)建了一個(gè)String類型的數(shù)組。
但是,等等,還有一種更簡(jiǎn)單的方法。 如上所述,生成器是可以創(chuàng)建所需大小的數(shù)組的函數(shù)。 Java 8的創(chuàng)建者非常善于引入一些語(yǔ)法糖來(lái)直接引用數(shù)組構(gòu)造函數(shù)。
通過(guò)在構(gòu)造函數(shù)引用中添加一個(gè)左,右方括號(hào),可以表示數(shù)組構(gòu)造函數(shù)引用 ,例如Type[]::new. 。 因此,上面的代碼行可以這樣重寫(xiě):
String[] array = Stream.of( ... ).toArray( String[]::new );編譯器將String[]::new表達(dá)式擴(kuò)展為size -> new String[ size ] 。 因此, 生成的字節(jié)碼與前一種方法相同 ,但是我發(fā)現(xiàn)后者更加簡(jiǎn)潔。
而且,它消除了錯(cuò)誤的生成的數(shù)組大小,這是不可能的,但仍然是可能的錯(cuò)誤。 考慮一下:
String[] array = Stream.of( "a", "b", "c" ).toArray( size -> new String[ 1 ] );創(chuàng)建的數(shù)組顯然太小。 它的實(shí)際大小(一個(gè))將永遠(yuǎn)無(wú)法容納這三個(gè)結(jié)果元素。 因此將以IllegalStateException結(jié)尾。 使用數(shù)組構(gòu)造函數(shù)引用時(shí),編譯器將確保創(chuàng)建適當(dāng)大小的數(shù)組。
當(dāng)然,還有一個(gè)通用的toArray()方法可返回一個(gè)對(duì)象數(shù)組,如果結(jié)果數(shù)組的實(shí)際類型無(wú)關(guān)緊要,則可以使用該方法。
從數(shù)組到流再返回的結(jié)論
像我親愛(ài)的同事Ralf一樣 ,許多程序員在API接口中更喜歡集合而不是數(shù)組。 但是仍然有許多“老式” API要求您處理數(shù)組。 而且與API一樣,這些不會(huì)很快消失。
但是,無(wú)論您喜歡哪種方式,或者無(wú)論哪種方式都必須使用現(xiàn)有代碼,我都發(fā)現(xiàn)Java 8在兩個(gè)世界之間提供了一個(gè)不錯(cuò)的橋梁,這是一個(gè)好消息。
如果您有任何疑問(wèn),建議或想分享您在該領(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
java8 從數(shù)組獲取流
總結(jié)
以上是生活随笔為你收集整理的java8 从数组获取流_从数组到流再到Java 8的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 哪个品牌的笔记本电脑质量好(哪个品牌的笔
- 下一篇: 三种移动硬盘无法识别,计算机无法识别移动