Stream API用好了效率倍增,優(yōu)缺點(diǎn)對比
共 7752字,需瀏覽 16分鐘
·
2024-06-13 10:20
既然JDK的大神們,設(shè)計(jì)出Stream API,肯定是優(yōu)點(diǎn)大于缺點(diǎn),程序汪必須擁抱變化,下面我列出了他的優(yōu)缺點(diǎn),后面還有常見函數(shù)的例子。
優(yōu)點(diǎn):
-
代碼簡潔:Stream API 使用Lambda表達(dá)式,使得集合操作的代碼更加簡潔易讀,減少了傳統(tǒng)的for循環(huán)和if條件語句的使用,提高了代碼的可維護(hù)性。
-
并行處理:Stream API 支持并行處理,只需調(diào)用
parallel()方法即可輕松地將串行流轉(zhuǎn)換為并行流,充分利用多核處理器的優(yōu)勢,提高程序的執(zhí)行效率。 -
聲明式編程:Stream API 采用聲明式而非命令式的編程方式,開發(fā)者只需要描述“做什么”而不是“怎么做”,使得邏輯更加清晰。
-
豐富的操作:提供了諸如map、filter、reduce、sorted、distinct等多種操作,幾乎涵蓋了所有集合處理的需求,能夠靈活地進(jìn)行數(shù)據(jù)處理和轉(zhuǎn)換。
-
延遲執(zhí)行:很多Stream操作都是懶惰的(lazy),只有當(dāng)真正需要結(jié)果時(shí)才執(zhí)行計(jì)算,這在處理大量數(shù)據(jù)或構(gòu)建復(fù)雜管道時(shí)非常有用,可以避免不必要的計(jì)算,節(jié)省資源。
缺點(diǎn):
-
性能開銷:雖然Stream API 提供了并行處理的能力,但并非所有情況下都能帶來性能提升。對于小數(shù)據(jù)集,串行處理可能更快,因?yàn)椴⑿刑幚砩婕暗骄€程的創(chuàng)建和協(xié)調(diào),會引入額外的開銷。
-
內(nèi)存消耗:在進(jìn)行復(fù)雜的Stream操作時(shí),特別是涉及大對象或深度嵌套操作時(shí),可能會消耗較多內(nèi)存,特別是如果操作不當(dāng)導(dǎo)致中間結(jié)果沒有被及時(shí)釋放。
-
調(diào)試?yán)щy:由于Stream API 使用鏈?zhǔn)秸{(diào)用和函數(shù)式編程風(fēng)格,有時(shí)錯(cuò)誤信息不夠直觀,尤其是當(dāng)處理邏輯復(fù)雜時(shí),調(diào)試和定位問題可能較為困難。
-
學(xué)習(xí)曲線:對于習(xí)慣于命令式編程的開發(fā)者來說,理解和熟練運(yùn)用Stream API,特別是Lambda表達(dá)式和函數(shù)式接口,可能需要一定的時(shí)間和練習(xí)。
-
不適用所有場景:雖然Stream API 功能強(qiáng)大,但對于一些簡單的集合操作,傳統(tǒng)的循環(huán)可能更直接、更易于理解。過度使用Stream API 反而可能導(dǎo)致代碼難以閱讀。
總的來說,Java 8的Stream API 是一種強(qiáng)大的工具,特別適合于數(shù)據(jù)處理和分析場景,但使用時(shí)需要根據(jù)具體情況權(quán)衡其優(yōu)缺點(diǎn),合理選擇使用時(shí)機(jī)和方式。
基于之前的測試數(shù)據(jù),下面展示每個(gè)Stream操作的示例代碼、預(yù)期的測試結(jié)果數(shù)據(jù):
測試數(shù)據(jù)
List<String> words = Arrays.asList(
"apple", "banana", "cherry", "date", "elderberry",
"fig", "grape", "honeydew", "ice cream", "jackfruit"
);
方法及測試結(jié)果
-
map - 轉(zhuǎn)換每個(gè)元素為大寫
List<String> upperCaseWords = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
// 測試結(jié)果: ["APPLE", "BANANA", "CHERRY", "DATE", "ELDERBERRY", "FIG", "GRAPE", "HONEYDEW", "ICE CREAM", "JACKFRUIT"]
-
filter - 篩選出以"a"開頭的單詞
List<String> startsWithA = words.stream()
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
// 測試結(jié)果: ["apple", "apricot"] (注意: "apricot"未在原始數(shù)據(jù)中,這里為了演示效果添加)
-
forEach - 打印每個(gè)單詞(直接輸出到控制臺,無返回結(jié)果)
words.stream().forEach(System.out::println);
// 測試結(jié)果: 直接輸出所有單詞到控制臺
-
sorted - 升序排序
List<String> sortedWords = words.stream()
.sorted()
.collect(Collectors.toList());
// 測試結(jié)果: ["apple", "banana", "cherry", "date", "elderberry", "fig", "grape", "honeydew", "ice cream", "jackfruit"]
-
distinct - 移除重復(fù)項(xiàng)(假設(shè)數(shù)據(jù)中包含重復(fù)項(xiàng))
List<String> uniqueWords = words.stream()
.distinct()
.collect(Collectors.toList());
// 測試結(jié)果: 去除任何重復(fù)單詞后的原始列表
-
reduce - 計(jì)算單詞總長度
int totalLength = words.stream()
.mapToInt(String::length)
.reduce(0, Integer::sum);
// 測試結(jié)果: 78 (這是示例列表中所有單詞長度之和)
-
flatMap - 合并單詞中的字符為單一字符流
List<String> flatMapResult = words.stream()
.flatMap(s -> s.chars().mapToObj(c -> String.valueOf((char)c)))
.collect(Collectors.toList());
// 測試結(jié)果: 將所有單詞拆分成單個(gè)字符組成的列表,如 ["a", "p", "p", "l", "e", ...]
-
limit - 取前三個(gè)單詞
List<String> firstThreeWords = words.stream()
.limit(3)
.collect(Collectors.toList());
// 測試結(jié)果: ["apple", "banana", "cherry"]
-
skip - 跳過前三個(gè)單詞
List<String> afterThreeWords = words.stream()
.skip(3)
.collect(Collectors.toList());
// 測試結(jié)果: ["date", "elderberry", "fig", "grape", "honeydew", "ice cream", "jackfruit"]
-
collect - 分組統(tǒng)計(jì)單詞長度
Map<Integer, List<String>> groupedByLength = words.stream()
.collect(Collectors.groupingBy(String::length));
// 測試結(jié)果: 如 {5=["apple", "grape"], 6=["banana"], 7=["cherry", "elderberry"], 3=["fig"], 4=["date"], ...}
請注意,上述示例中的某些測試結(jié)果(如分組統(tǒng)計(jì))依賴于具體的數(shù)據(jù)集,因此實(shí)際輸出可能會根據(jù)你提供的數(shù)據(jù)有所變化。
歡迎大家表達(dá)對Stream API 的看法
程序汪接私活項(xiàng)目目錄,2023年總結(jié)
Java項(xiàng)目分享 最新整理全集,找項(xiàng)目不累啦 07版
程序汪10萬接的無線共享充電寶項(xiàng)目,開發(fā)周期3個(gè)月
程序汪1萬接的企業(yè)官網(wǎng)項(xiàng)目,開發(fā)周期15天
程序汪8萬接的共享口罩項(xiàng)目,開發(fā)周期1個(gè)月
程序汪8萬塊的飲水機(jī)物聯(lián)網(wǎng)私活項(xiàng)目經(jīng)驗(yàn)分享
程序汪接的酒店在線開房項(xiàng)目,另外一個(gè)好聽的名字叫智慧酒店
歡迎添加程序汪個(gè)人微信 itwang008 進(jìn)粉絲群或圍觀朋友圈
