从数组到流再到Java 8
不久前,我們將一些Eclipse插件項目升級到Java8。此后再也沒有回頭。 除其他事項外,使用lambda和streams API ,過濾,映射和查找集合中的元素變得更加容易和簡潔。 我想到目前為止,對于大多數人來說,什么都沒有。
但是許多現有的API在參數和/或返回數組中使用數組。 例如,請考慮以下虛構但通用的方法簽名:
String[] filterStrings( String... input );隨之而來的是從數組中獲取流的額外工作,以便能夠優雅地過濾,映射,縮小等元素。 然后取回一個可以傳遞給老式API的數組。
向前…
要從數組中獲取流,有很多選擇。 例如,這行代碼
Stream stream = Stream.of( "a", "b", "c" );產生具有指定元素的流。 同樣可以通過以下方式實現:
Stream stream = Arrays.stream( "a", "b", "c" );實際上, Stream.of()使用Arrays.stream()完成任務。 通過列表繞行也會產生流:
Stream stream = Arrays.asList( "a", "b", "c" ).stream();… 然后回來
一旦有了流,就可以使用所有流功能,例如,從字符串數組中過濾空字符串:
Stream.of( "a", "", "b", "", "c", "" ).filter( string -> !string.isEmpty() );但是如何返回結果數組呢?
有用于集合和列表的收集器,但不包括用于簡單數組的收集器。 此代碼段
List<String> list= Stream.of( ... ).filter( ... ).collect( Collectors.toList() ); String[] array = list.toArray( new String[ list.size() ] );使用toList()獲得過濾后的輸入的列表,然后在第二步中將該列表轉換為數組。
我幾乎要實現一個自定義數組收集器,以消除多余的步驟。 直到我發現有一個終端操作可以像這樣簡單地將流的結果捕獲到數組中:
String[] array = Stream.of( ... ).toArray( size -> new String[ size ] );toArray()需要generator ,它是對能夠創建所請求大小的數組的方法的引用。 在這里創建一個String類型的數組。
但是,等等,還有一種更簡單的方法。 如上所述,生成器是可以創建所需大小的數組的函數。 Java 8的開發者非常善于引入一些語法糖來直接引用數組構造函數。
通過在構造函數引用中添加一個左,右方括號,可以表示一個數組構造器引用 ,例如Type[]::new. 。 因此,上面的代碼行可以這樣重寫:
String[] array = Stream.of( ... ).toArray( String[]::new );編譯器將String[]::new表達式擴展為size -> new String[ size ] 。 因此, 生成的字節碼與前一種方法相同 ,但是我發現后者更為簡潔。
而且,它消除了錯誤的生成的數組大小,這是不可能的,但仍然是可能的錯誤。 考慮一下:
String[] array = Stream.of( "a", "b", "c" ).toArray( size -> new String[ 1 ] );創建的數組顯然太小。 它的實際大小(一個)將永遠無法容納這三個結果元素。 因此將以IllegalStateException結尾。 使用數組構造函數引用時,編譯器將確保創建適當大小的數組。
當然,還有一個通用的toArray()方法可返回一個Objects數組,如果結果數組的實際類型無關緊要,則可以使用該方法。
從數組到流再返回的結論
像我親愛的同事Ralf一樣 ,許多程序員更喜歡API接口中的集合而不是數組。 但是仍然有許多“老式” API要求您處理數組。 而且與API一樣,這些不會很快消失。
但是,無論您喜歡哪種方式,或者無論哪種方式都必須使用現有代碼,我都發現Java 8在兩個世界之間提供了一個不錯的橋梁,這是一個好消息。
如果您有任何疑問,建議或想分享您在該領域的經驗,請發表評論。
翻譯自: https://www.javacodegeeks.com/2015/11/from-arrays-to-streams-and-back-with-java-8.html
總結
以上是生活随笔為你收集整理的从数组到流再到Java 8的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现货黄金和美元的联系?
- 下一篇: 2019余额宝冻结金额怎么解冻?