10 個 Java Stream 頂級技巧,大量簡化代碼!

Java Stream API 對於 Java 開發人員來說就像一把瑞士軍刀 — 它用途廣泛、結構緊湊,並且可以輕鬆處理各種任務。

它爲開發人員提供了一種函數式和聲明式的方式來表達複雜的數據轉換和操作,使代碼更加簡潔和富有表現力。

但能力越大,責任越大,有效地使用 Stream API 需要對最佳實踐和常見陷阱有深入的瞭解。

今天,我們將探討使用 Java Stream API 的一些最佳實踐,並展示如何釋放這個神奇工具的全部潛力。

歡迎關注公衆號:SpringForAll 社區(spring4all.com),專注分享關於 Spring 的一切!回覆 “加羣” 還可加入 Spring 技術交流羣!

1. 使用原始流以獲得更好的性能

使用 int、long 和 double 等基本類型時,請使用 IntStream、LongStream 和 DoubleStream 等基本流,而不是 Integer、Long 和 Double 等裝箱類型流。原始流可以通過避免裝箱和拆箱的成本來提供更好的性能。

var array = new int[]{1, 2, 3, 4, 5};
var sum = Arrays.stream(array)
               .sum();

2. 避免嵌套流

最佳實踐是避免嵌套流,因爲它可能導致代碼難以閱讀和理解。相反,嘗試將問題分解爲更小的部分,並使用中間集合或局部變量來存儲中間結果。

var list1 = Arrays.asList("apple""banana""cherry");
var list2 = Arrays.asList("orange""pineapple""mango");
var result = Stream.concat(list1.stream(), list2.stream())
                  .filter(s -> s.length() > 5)
                  .collect(Collectors.toList());

3. 謹慎使用並行流

並行流可以在處理大量數據時提供更好的性能,但它們也會引入開銷和競爭條件。謹慎使用並行流,並考慮數據大小、操作複雜性和可用處理器數量等因素。

var list = Arrays.asList(1, 2, 3, 4, 5);
var sum = list.parallelStream().reduce(0, Integer::sum);

4. 使用惰性求值以獲得更好的性能

Stream API 支持延遲計算,這意味着在調用終端操作之前不會執行中間操作。作爲最佳實踐,嘗試使用惰性計算來通過減少不必要的計算來提高性能。

var list = Arrays.asList(1, 2, 3, 4, 5);
var result = list.stream()
                 .filter(n -> n > 3)
                 .findFirst();

5. 避免副作用

Stream API 旨在對數據執行功能操作。避免引入副作用,例如修改流外部的變量或執行 I/O 操作,因爲這可能會導致不可預測的行爲並降低代碼可讀性。

var list = Arrays.asList("apple""banana""cherry");
var count = 0;
list.stream()
    .filter(s -> s.startsWith("a"))
    .forEach(s -> count++);

6. 將流與不可變對象一起使用

Stream API 最適合不可變對象。使用不可變對象可確保流的狀態在處理過程中不會被修改,這可以帶來更可預測的行爲和更好的代碼可讀性

var list = Arrays.asList("apple""banana""cherry");
var result = list.stream()
                 .map(String::toUpperCase)
                 .collect(Collectors.toList());

7. 在 map() 之前使用 filter() 以避免不必要的處理

如果你的流可能包含大量不符合你的條件的元素,請在 map() 之前使用 filter() 以避免不必要的處理。這可以提高代碼的性能。

var list = Arrays.asList(1, 2, 3, 4, 5);
var filteredList = list.stream()
                       .filter(i -> i % 2 == 0)
                       .map(i -> i * 2)
                       .collect(Collectors.toList());

8. 優先選擇方法引用而不是 lambda 表達式

與使用 lambda 表達式相比,方法引用可以使我們的代碼更加簡潔和可讀。在合適的情況下,優先使用方法引用代替 lambda 表達式。

var list = Arrays.asList(1, 2, 3, 4, 5);
var sum = list.stream()
              .reduce(0, Integer::sum);

9. 使用 distinct() 刪除重複項

如果你的流可能包含重複元素,請使用 distinct() 操作來刪除它們

var list = Arrays.asList(1, 2, 3, 3, 4, 5, 5);
var distinctList = list.stream()
                       .distinct()
                       .collect(Collectors.toList());

10. 謹慎使用 sorted()

Sorted() 操作可能會很昂貴,尤其是對於大型流。僅在必要時謹慎使用。如果你確定輸入的數據已經排序,則可以跳過此操作。

var  list  = Arrays.asList( 3 , 2 , 1 ); 
var  SortedList  = list.stream() 
                     .sorted() 
                     .collect(Collectors.toList());

總之,Java Stream API 是一個強大而靈活的工具,可以顯著簡化數據處理任務的代碼。

通過遵循本文中討論的提示,可以確保代碼既高效又有效。但是,請務必記住,有效使用 Java Stream API 需要充分了解其功能和限制。

不斷學習和探索 Java Stream API 的世界,釋放其全部潛力。

原文:blog.csdn.net/jike11231/article/details/126818020

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/-rAosHEpBytJ8wvEmVSFtw