Java Stream API對於 Java 開發人員來說就像一把瑞士軍刀 — 它用途廣泛、結構緊湊,並且可以輕松處理各種任務。
它為開發人員提供了一種函式式和聲明式的方式來表達復雜的數據轉換和操作,使程式碼更加簡潔和富有表現力。
但能力越大,責任越大,有效地使用Stream API需要對最佳實踐和常見陷阱有深入的了解。
今天,我們將探討使用Java Stream API的一些最佳實踐,並展示如何釋放這個神奇工具的全部潛力。
1. 使用原始流以獲得更好的效能
使用 int、long 和 double 等基本型別時,請使用IntStream、LongStream 和 DoubleStream 等基本流,而不是 Integer、Long 和 Double 等裝箱型別流。原始流可以透過避免裝箱和拆箱的成本來提供更好的效能。
var array = newint[]{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
>>
END
精品資料,超贊福利,免費領
微信掃碼/長按辨識 添加【技術交流群】
群內每天分享精品學習資料
最近開發整理了一個用於速刷面試題的小程式;其中收錄了上千道常見面試題及答案(包含基礎、並行、JVM、MySQL、Redis、Spring、SpringMVC、SpringBoot、SpringCloud、訊息佇列等多個型別),歡迎您的使用。
👇👇
👇點選"閱讀原文",獲取更多資料(持續更新中)