Lambda表達式及Stream的使用

前言:

? ??函數式編程是一種編程范式,它將計算過程視為函數應用的連續組合。函數式編程強調使用純函數(Pure Function),避免使用可變狀態和副作用,倡導將計算過程抽象為函數,便于代碼的理解、測試和并行化。在JDK8之前主要函數式編程主要體現在匿名內部類的使用上。

Thread thread = new Thread(new Runnable() {public void run() {System.out.println("Hello from anonymous inner class");}
});
thread.start();

一、Lambda表達式

1.1?Lambda表達式的理解

? ? ??Lambda表達式是JAVA8提出的又一種函數式編程的體現,旨在提供一種更簡潔的語法來表示函數式接口(只有一個抽象方法的接口)的實例。可以理解為??Lambda表達式就是對函數式接口實現的一種優化。

1.2?Lambda表達式的語法

? ? ? Lambda表達式的基本語法如下:

(parameters) -> expression

? ?或

(parameters) -> { statements; }

? ? ? ? 其中,參數可以是任意合法的Java參數列表,可以為空或包含一個或多個參數。箭頭(->)將參數與Lambda主體分隔開來。

? ? ? ? Lambda主體可以是一個表達式,也可以是一個代碼塊。如果主體是一個表達式,它將直接返回該表達式的結果。如果主體是一個代碼塊,它將按照常規的Java語法執行,并且您可能需要使用return語句來返回值。? ?如果表達式只有一句代碼,則可以考慮省略{} 或return 關鍵字。

1.3?Lambda表達式的使用

  1. 無參數的Lambda表達式:
() -> System.out.println("Hello, Lambda!");

? ? ?2. 有參數的Lambda表達式:?

(x,y) -> System.out.println("Hello, Lambda!");

? ? ? ? 這里 x、y是什么參數類型,要視上層調用方法體而定。

? ? ?3. 帶有多行代碼的Lambda表達式:

(x, y) -> {int sum = x + y;System.out.println("Sum: " + sum);return sum;
}

? ? ?4. 函數式接口的實現

# 定義函數式接口 , 無返回值
public interface Interface1 {void getData(String mallId);}# Lambda 表達式的實現
# 如果接口只有一個參數, 則參數的 () 可以省略
# 如果表達式只有一句代碼,則表達式的 {} 可以省略
Interface1 interface1  = x ->  System.out.println("線程執行");# 定義函數式接口 , 有返回值
public interface Interface2 {String getData(String mallId);}# Lambda 表達式的實現
# 只有一個參數, 則參數的 () 可以省略
# 表達式只有一句代碼,則表達式的 {} 、return 都可以省略
Interface2 b = x ->  "hello";

二、Stream 流式調用?

1.1 流式調用的理解

? ? ? ? Stream將要處理的元素集合看作一種流,在流的過程中,借助Stream API對流中的元素進行操作,比如:篩選、排序、聚合等。

Stream可以由數組或集合創建,對流的操作分為兩種:

中間操作:

? ? ? ??指每次返回一個新的流,可以有多個。這些操作是延遲執行的(lazy),也就是說它們不會立即執行,只是在遇到終端操作時才會開始執行。中間操作允許對流中的元素進行一系列轉換、過濾等處理。

常見的中間操作有:

  • filter(Predicate<? super T> predicate): 過濾流中的元素。
  • map(Function<? super T, ? extends R> mapper): 將每個元素轉換為另一種形式。
  • flatMap(Function<? super T, ? extends Stream<? extends R>> mapper): 將每個元素轉換為一個流,然后將這些流扁平化為一個流。
  • distinct(): 去除流中的重復元素。
  • sorted(): 對流中的元素進行自然排序。
  • sorted(Comparator<? super T> comparator): 按指定的比較器對流中的元素進行排序。
  • peek(Consumer<? super T> action): 對流中的每個元素執行一個操作,并返回一個新的流。

例如:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class IntermediateOperationsExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");List<String> filteredNames = names.stream().filter(name -> name.startsWith("A")) // 中間操作.map(String::toUpperCase)             // 中間操作.collect(Collectors.toList());        // 終端操作filteredNames.forEach(System.out::println);}
}

終端操作:

每個流只能進行一次終端操作,終端操作結束后流無法再次使用。終端操作會產生一個新的集合或值。

常見的終端操作有:

  • collect(Collector<? super T, A, R> collector): 將流中的元素收集到一個集合、列表、映射等。
  • forEach(Consumer<? super T> action): 對流中的每個元素執行一個操作。
  • reduce(BinaryOperator<T> accumulator): 通過反復結合流中的元素來減少流中的元素。
  • count(): 返回流中的元素個數。
  • anyMatch(Predicate<? super T> predicate): 判斷是否有任意一個元素匹配給定的謂詞。
  • allMatch(Predicate<? super T> predicate): 判斷是否所有元素都匹配給定的謂詞。
  • noneMatch(Predicate<? super T> predicate): 判斷是否沒有元素匹配給定的謂詞。
  • findFirst(): 返回流中的第一個元素。
  • findAny(): 返回流中的任意一個元素。

另外,Stream有幾個特性:

  • stream不存儲數據,而是按照特定的規則對數據進行計算,一般會輸出結果。

  • stream不會改變數據源,通常情況下會產生一個新的集合或一個值。

  • stream具有延遲執行特性,只有調用終端操作時,中間操作才會執行。

  • Stream中的元素是以Optional類型存在的。

1.2?流式調用案例

1.2.1 流的創建

// 方式一:通過 java.util.Collection.stream() 方法用集合創建流
List<String> list = Arrays.asList("a", "b", "c");
// 創建一個順序流
Stream<String> stream = list.stream();
// 創建一個并行流
Stream<String> parallelStream = list.parallelStream();// 方式二:使用java.util.Arrays.stream(T[] array)方法用數組創建流
nt[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);// 方式三:使用Stream的靜態方法:of()、iterate()、generate()
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::println);Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);

1.2.2?循環遍歷

List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);// 遍歷輸出符合條件的元素
list.stream().filter(x -> x > 6).forEach(System.out::println);
// 匹配第一個
Optional<Integer> findFirst = list.stream().filter(x -> x > 6).findFirst();
// 匹配任意(適用于并行流)
Optional<Integer> findAny = list.parallelStream().filter(x -> x > 6).findAny();
// 是否包含符合特定條件的元素boolean anyMatch = list.stream().anyMatch(x -> x < 6);
System.out.println("匹配第一個值:" + findFirst.get());
System.out.println("匹配任意一個值:" + findAny.get());
System.out.println("是否存在大于6的值:" + anyMatch);

1.2.3 篩選

List<String> fiterList = personList.stream().filter(x -> x.getSalary() > 8000).map(Person::getName).collect(Collectors.toList());

1.2.4 聚合

// 獲取String集合中最長的元素。
Optional<String> max = list.stream().max(Comparator.comparing(String::length));
System.out.println("最長的字符串:" + max.get());// 獲取Integer集合中的最大值。// 自然排序
Optional<Integer> max = list.stream().max(Integer::compareTo);
// 自定義排序
Optional<Integer> max2 = list.stream().max(new Comparator<Integer>() {@Override
public int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}
});// 獲取員工工資最高的人Optional<Person> max = personList.stream().max(Comparator.comparingInt(Person::getSalary));System.out.println("員工工資最大值:" + max.get().getSalary());// 計算Integer集合中大于6的元素的個數。
long count = list.stream().filter(x -> x > 6).count();
System.out.println("list中大于6的元素個數:" + count);

1.2.5 映射

映射,可以將一個流的元素按照一定的映射規則映射到另一個流中。分為map和flatMap:

  • map:接收一個函數作為參數,該函數會被應用到每個元素上,并將其映射成一個新的元素。

  • flatMap:接收一個函數作為參數,將流中的每個值都換成另一個流,然后把所有流連接成一個流。

// 英文字符串數組的元素全部改為大寫。
String[] strArr = { "abcd", "bcdd", "defde", "fTr" };List<String> strList = Arrays.stream(strArr).map(String::toUpperCase).collect(Collectors.toList());// 整數數組每個元素+3。
List<Integer> intList = Arrays.asList(1, 3, 5, 7, 9, 11);List<Integer> intListNew = intList.stream().map(x -> x + 3).collect(Collectors.toList());// 將兩個字符數組合并成一個新的字符數組。
List<String> list = Arrays.asList("m,k,l,a", "1,3,5,7");List<String> listNew = list.stream().flatMap(s -> {
// 將每個元素轉換成一個streamString[] split = s.split(",");Stream<String> s2 = Arrays.stream(split);
return s2;}).collect(Collectors.toList());

1.2.6 規約

? ? ? 歸約,也稱縮減,顧名思義,是把一個流縮減成一個值,能實現對集合求和、求乘積和求最值操作。

List<Integer> list = Arrays.asList(1, 3, 2, 8, 11, 4);
// 求和方式1
Optional<Integer> sum = list.stream().reduce((x, y) -> x + y);
// 求和方式2
Optional<Integer> sum2 = list.stream().reduce(Integer::sum);
// 求和方式3
Integer sum3 = list.stream().reduce(0, Integer::sum);// 求乘積
Optional<Integer> product = list.stream().reduce((x, y) -> x * y);// 求最大值方式1
Optional<Integer> max = list.stream().reduce((x, y) -> x > y ? x : y);
// 求最大值寫法2
Integer max2 = list.stream().reduce(1, Integer::max);System.out.println("list求和:" + sum.get() + "," + sum2.get() + "," + sum3);
System.out.println("list求積:" + product.get());
System.out.println("list求和:" + max.get() + "," + max2);

1.2.6 收集?

// List 轉 MapMap<?, Person> map = personList.stream().filter(p -> p.getSalary() > 8000).collect(Collectors.toMap(Person::getName, p -> p));// Map 轉 List
map.entrySet().stream().map(a->a.getKey()).collect(Collectors.toList());

1.2.7 接合

List<String> list = Arrays.asList("A", "B", "C");String string = list.stream().collect(Collectors.joining("-"));System.out.println("拼接后的字符串:" + string);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18775.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pytorch訓練LeNet模型MNIST數據集

如何用torch框架訓練深度學習模型&#xff08;詳解&#xff09; 0. 需要的包 import torch from torch.nn import CrossEntropyLoss from torch.optim import SGD from torch.utils.data import DataLoader from torchvision import datasets, transforms1. 數據加載和導入 …

Python圖形界面(GUI)Tkinter筆記(九):用【Button()】功能按鈕實現人機交互

在Tkinter庫中,功能按鈕(Button)是實現人機交互的一個非常重要的組件: 【一】主要可實現功能及意義: (1)響應用戶交互: Button組件允許用戶通過點擊來觸發某個事件或動作。當用戶點擊按鈕時,可以執行一個指定的函數或方法。 (2)提供用戶輸入: Button組件是圖形用戶界面(G…

持續總結中!2024年面試必問 20 道 Rocket MQ面試題(三)

上一篇地址&#xff1a;持續總結中&#xff01;2024年面試必問 20 道 Rocket MQ面試題&#xff08;二&#xff09;-CSDN博客 五、什么是生產者&#xff08;Producer&#xff09;和消費者&#xff08;Consumer&#xff09;在RocketMQ中&#xff1f; RocketMQ是一個高性能、高吞…

Linux完整版命令大全(二十五)

pine 功能說明&#xff1a;收發電子郵件&#xff0c;瀏覽新聞組。語  法&#xff1a;pine [-ahikorz][-attach<附件>][-attach_and_delete<附件>][-attachlist<附件清單>][-c<郵件編號>][-conf][-create_lu<地址薄><排序法>][-f<收件…

劇本殺小程序開發,探索市場發展新的商業機遇

劇本殺游戲作為一個新興行業&#xff0c;經歷了爆發式的增長&#xff0c;劇本殺游戲在市場中的熱度不斷升高。 不過&#xff0c;在市場的火熱下&#xff0c;競爭也在逐漸加大。因此&#xff0c;在市場競爭下&#xff0c;成本低、主題多樣、有趣的線上劇本殺小程序成為了創業者…

竹云董事長在第二屆ICT技術發展與企業數字化轉型高峰論壇作主題演講

5月25日&#xff0c;由中國服務貿易協會指導&#xff0c;中國服務貿易協會信息技術服務委員會主辦的 “第二屆ICT技術發展與企業數字化轉型高峰論壇” 在北京隆重召開。 本次論壇以 “數據驅動&#xff0c;AI引領&#xff0c;打造新質生產力” 為主題&#xff0c;特邀業內200余…

WebGL實現醫學教學軟件

使用WebGL實現醫學教學軟件是一個復雜但非常有益的項目&#xff0c;可以顯著提升醫學教育的互動性和效果。以下是詳細的實現步驟&#xff0c;包括需求分析、技術選型、開發流程和注意事項。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xff0c;歡迎交流合作…

redis-cli help使用

1. redis-cli命令使用—先連接上服務器 連接到 Redis 服務器&#xff1a; 使用 redis-cli 命令即可連接到本地運行的 Redis 服務器&#xff0c;默認連接到本地的 6379 端口。 redis-cli如果 Redis 服務器不在本地或者端口不同&#xff0c;可以使用 -h 和 -p 參數指定主機和端…

華為校招機試 - LRU模擬(20240515)

題目描述 LRU(Least Recently Used)緩存算法是一種常用于管理緩存的策略,其目標是保留最近使用過的數據,而淘汰最久未被使用的數據。 實現簡單的LRU緩存算法,支持查詢、插入、刪除操作。 最久未被使用定義:查詢、插入和刪除操作均為一次訪問操作,每個元素均有一個最后…

探索Django 5: 從零開始,打造你的第一個Web應用

今天我們將一起探索 Django 5&#xff0c;一個備受開發者喜愛的 Python Web 框架。我們會了解 Django 5 的簡介&#xff0c;新特性&#xff0c;如何安裝 Django&#xff0c;以及用 Django 編寫一個簡單的 “Hello, World” 網站。最后&#xff0c;我會推薦一本與 Django 5 相關…

蘇洵,大器晚成的家風塑造者

&#x1f4a1; 如果想閱讀最新的文章&#xff0c;或者有技術問題需要交流和溝通&#xff0c;可搜索并關注微信公眾號“希望睿智”。 蘇洵&#xff0c;字明允&#xff0c;號老泉&#xff0c;生于宋真宗大中祥符二年&#xff08;公元1009年&#xff09;&#xff0c;卒于宋英宗治平…

量產導入 | 產品可靠性測試標準完整大集合(JEDEC/IEC/SAE…)

產品可靠性測試標準完整大集合(JEDEC/IEC/SAE…) 產品可靠性測試是產品質量保證中的重要一環, 包含有Pre-con, aging(壽命)和ESD(靜電)等, 下面就收集了權威標準JEDEC全系列, 請參照如下 同時也附上其它的可靠性標準供大家參考及交叉理解, 可能側重點不同, 大家可以參…

go語言同一包中的同一變量實現不同平臺設置不同的默認值 //go:build 編譯語法使用示例

在使用go來開發跨平臺應用的時候&#xff0c;比如配置文件的路徑&#xff0c;我們希望設置一個默認值&#xff0c;windows下的路徑是類似 d:\myapp\app.conf 這樣的&#xff0c; unix系統中的路徑是 /opt/myapp/app.conf 這樣的&#xff0c; 而我們在使用的時候需要使用的是同…

PPT忘記保存?教你如何輕松恢復

在日常辦公中PPT文件作為主流文檔格式&#xff0c;承載著我們大量的工作成果。然而當不小心誤點了“不保存”按鈕&#xff0c;或是遭遇軟件崩潰等意外情況導致文檔丟失時&#xff0c;文件內容是否還能夠能恢復&#xff0c;往往成為我們最關心的問題。本文將為您提供五大免費且實…

NetCore PetaPoco 事務處理分享

PetaPoco是一個輕量級的.NET和Mono數據庫訪問庫&#xff0c;它以單個C#文件的形式存在&#xff0c;便于集成到任何項目中。PetaPoco的主要特點包括無依賴性、快速的性能和對簡單事務的支持。它適用于嚴格的沒有裝飾的Poco類以及幾乎全部加了特性的Poco類&#xff0c;并提供了多…

現在版本的ultralytics沒有setup.py以后,本地代碼中修改了ultralytics源碼,怎么安裝到python環境中。

問題&#xff0c;在使用ultralytics訓練yolov8-obb模型時&#xff0c;修改了ultralytics源碼的網絡結構&#xff0c;發現調用的還是pip install安裝的ultralytics庫&#xff0c;新版本源碼中還沒有setup.py&#xff0c;該怎么把源碼中的ultralytics安裝到環境中。 解決方法&am…

《探索網絡七層模型:構建高效通信架構的關鍵》

在當今數字化時代&#xff0c;網絡通信已經成為人們生活和工作中不可或缺的一部分。而網絡七層模型作為計算機網絡體系結構的重要基礎&#xff0c;其技術架構對于構建高效、穩定的通信系統具有重要意義。本文將深入探討網絡七層模型的技術架構設計&#xff0c;以及其在構建現代…

輕松掌握圖片批量處理,趕緊學習這些小技巧!

在現今數字化的社會中&#xff0c;我們每天都會接觸到大量的圖片&#xff0c;無論是在工作中還是日常生活中。要想高效處理這些圖片&#xff0c;掌握圖片批量處理的技巧就顯得尤為重要。幸運的是&#xff0c;有許多小技巧和工具可以讓這一過程變得輕松愉快。 在本文中&#xf…

長安鏈使用Golang編寫智能合約教程(三)

本篇主要介紹長安鏈Go SDK寫智能合約的一些常見方法的使用方法或介紹 資料來源&#xff1a; 官方文檔官方示例合約庫官方SDK接口文檔 一、獲取參數、獲取狀態、獲取歷史記錄的方法解析 注意&#xff01; 這些查詢鏈上數據的方法&#xff1a;只能是查詢本合約之前上鏈的數據&a…

信息學一周賽事安排

本周比賽提醒 本周有以下幾場比賽即將開始&#xff1a; 1.ABC-356 比賽時間&#xff1a;6月1日&#xff08;周六&#xff09;晚20:00 比賽鏈接&#xff1a;https://atcoder.jp/contests/abc356 2.ARC-179 比賽時間&#xff1a;6月2日&#xff08;周日&#xff09;晚20:00 …