」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Java 中的串流和 Lambda:函數式程式設計範例指南

Java 中的串流和 Lambda:函數式程式設計範例指南

發佈於2024-08-21
瀏覽:872

Streams and Lambdas in Java: A Guide to Functional Programming with Examples

函數式程式設計是現代軟體開發中廣泛使用的方法。 Java 是一種同時支援物件導向和函數式程式設計的語言,在其第 8 個版本中引入了串流和 lambda。這些功能允許開發人員將函數式風格應用於集合,使集合操作更加有效率和乾淨。

Java 中的流
Java 中的流將集合轉變為元素流。它們使開發人員能夠對集合執行功能操作,例如映射、過濾和歸約。流最適合涉及資料轉換、聚合或過濾的操作。

使用流的一個範例是按字母順序對名稱清單進行排序。我們可以建立一個名稱列表,然後使用流對它們進行排序,如下所示:

List 名稱 = Arrays.asList("約翰", "瑪莉", "大衛", "艾蜜莉", "湯姆");
name.stream().sorted().forEach(System.out::println); //輸出:大衛、艾蜜莉、約翰、瑪麗、湯姆

在這裡,我們使用清單上的stream()方法建立了一個串流。然後我們應用了sorted()方法來按自然順序對流中的元素進行排序。最後使用forEach()方法列印流中的每個元素。

Java 中的 Lambda 函數
Lambda 用於在 Java 中定義一等函數。這些函數可以使用流中的元素並對它們執行操作。 Lambda 是在類別外部定義的,可以作為參數傳遞給函數。

要將 lambda 表達式與流結合使用,我們需要了解函數式介面的概念。這些介面只有一個抽象方法。 Lambda 表達式可用於為函數式介面的抽象方法提供具體實作。

使用 lambda 對名稱清單進行排序
在上面的範例的基礎上,讓我們使用 lambda 對名稱進行降序排序。

List 名稱 = Arrays.asList("約翰", "瑪莉", "大衛", "艾蜜莉", "湯姆");
name.stream().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); //輸出:湯姆、瑪麗、約翰、艾蜜莉、大衛

在這裡,我們使用 lambda 表達式作為 Sorted() 方法的參數。此 lambda 函數接受兩個參數(a 和 b)並對它們進行比較,並根據比較結果返回正值、負值或零值。這允許我們使用元素上的compareTo()方法按降序對元素進行排序。

將流轉回集合
在某些情況下,我們可能希望在對流執行操作後將其轉換回集合。我們可以使用collect()方法來做到這一點,該方法接受Collector物件作為參數。

ListfilteredNames=names.stream()
.filter(name -> name.length() > 4) //只保留長度> 4的名稱
.collect(Collectors.toList()); //傳回過濾後的名稱清單

collect() 方法採用 Collector 類型的功能接口,並使用它將元素累積到集合中。在上面的範例中,我們使用 Collectors 類別中的 toList() 方法來建立過濾名稱清單。

流上的其他操作
除了排序和篩選之外,還可以對流執行其他操作,例如映射、歸約和迭代。這些操作允許我們分別對流中的元素進行轉換、減少和迭代。

繪製並減少數位流
假設我們有一個數字列表,我們想要找出所有偶數的總和。我們可以使用map()和reduce()方法來做到這一點。

List 數字 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = Numbers.stream()
.filter(num -> num % 2 == 0) //過濾掉奇數
.map(num -> num * 2) //偶數加倍
.reduce(0, (a, b) -> a b); //將所有數字加在一起

在這裡,我們使用map()方法將流中的偶數加倍,然後使用reduce()方法將所有數字加在一起。結果就是列表中所有偶數的總和。

流上的重複使用操作
在某些情況下,我們可能需要在多個流上使用相同的功能操作。為了避免一遍又一遍地編寫相同的程式碼,我們可以建立一個函數介面並將其作為參數傳遞給方法。

讓我們以按姓氏對姓名清單進行排序為例。我們可以建立一個實作Comparator介面的比較器類,並將其作為參數傳遞給sorted()方法。

靜態類別 LastNameComparator 實作 Comparator {
@覆蓋
公共 int 比較(字串名稱1,字串名稱2){
String[] parts1 = name1.split(" ");
字串lastName1 = parts1[parts1.length - 1];
String[] parts2 = name2.split(" ");
字串lastName2 = parts2[parts2.length - 1];
返回lastName2.compareTo(lastName1);
}
}

name.stream().sorted(new LastNameComparator()).forEach(System.out::println); //輸出:艾蜜莉、大衛、約翰、瑪莉、湯姆

在這裡,我們將 LastNameComparator 作為參數傳遞給排序()方法,以按姓氏對名稱進行排序。

結論
Java 中的流和 lambda 提供了一種強大且高效的方法來對集合執行函數操作。它們使開發人員能夠編寫乾淨、簡潔且可重複使用的程式碼。透過理解流和 lambda 的概念,我們可以提高整體編碼技能並編寫更有效率的程式碼。

提高 Java 技能的有效方法是獲得最新的 Java 認證並使用 MyExamCloud 上提供的 1Z0-830 練習測試。

版本聲明 本文轉載於:https://dev.to/myexamcloud/streams-and-lambdas-in-java-a-guide-to-functional-programming-with-examples-4cij?1如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3