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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

从数组到流再到Java 8

發布時間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从数组到流再到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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。