首頁  >  文章  >  Java  >  Java 中的串流和 Lambda:函數式程式設計範例指南

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

王林
王林原創
2024-08-16 10:31:35469瀏覽

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

列表數字 = 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; {
@覆蓋
public int Compare(字串名稱1, 字串名稱2) {
String[] parts1 = name1.split(" ");
String lastName1 = parts1[parts1.length - 1];
String[] parts2 = name2.split(" ");
String lastName2 = parts2[parts2.length - 1];
return lastName2.compareTo(lastName1);
}
}

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

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

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

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

以上是Java 中的串流和 Lambda:函數式程式設計範例指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn