Lambda 函數與 peek 操作的使用案例

Lambda 函數和 peek 操作是 Java 8 Stream API 中非常有用的特性,下面我將介紹它們的使用案例。

Lambda 函數使用案例
Lambda 表達式是 Java 8 引入的一種簡潔的匿名函數表示方式。
集合操作

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 使用 Lambda 表達式排序
Collections.sort(names, (a, b) -> a.compareTo(b));// 使用 Lambda 表達式遍歷
names.forEach(name -> System.out.println(name));// 使用方法引用
names.forEach(System.out::println);

過濾和映射

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 過濾偶數
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());// 平方映射
List<Integer> squares = numbers.stream().map(n -> n * n).collect(Collectors.toList());

peek 操作使用案例
peek() 是 Stream API 中的一個中間操作,主要用于調試或觀察流中的元素而不改變它們。

List<String> result = Stream.of("one", "two", "three", "four").filter(e -> e.length() > 3).peek(e -> System.out.println("Filtered value: " + e)).map(String::toUpperCase).peek(e -> System.out.println("Mapped value: " + e)).collect(Collectors.toList());

調試流操作
List numbers = Arrays.asList(1, 2, 3, 4, 5);

List result = numbers.stream()
.peek(x -> System.out.println("原始: " + x))
.map(x -> x * 2)
.peek(x -> System.out.println("乘2后: " + x))
.filter(x -> x > 5)
.peek(x -> System.out.println("過濾后: " + x))
.collect(Collectors.toList());
修改對象狀態

List<User> users = getUsers();List<User> updatedUsers = users.stream().peek(user -> {if (user.getAge() > 30) {user.setGroup("Senior");}}).collect(Collectors.toList());

結合使用 Lambda 和 peek 的實用案例
案例1:日志調試

List<String> transactions = getTransactions();List<String> validTransactions = transactions.stream().filter(t -> t.startsWith("TX"))  // Lambda 過濾.peek(t -> System.out.println("有效交易ID: " + t))  // 調試日志.map(t -> t.toUpperCase())  // Lambda 轉換.collect(Collectors.toList());

案例2:性能監控

List<Data> bigData = getData();long start = System.currentTimeMillis();List<Data> processed = bigData.stream().peek(d -> {if (System.currentTimeMillis() - start > 1000) {System.out.println("處理超時警告");}}).map(d -> processData(d))  // 假設processData是一個處理方法.collect(Collectors.toList());

案例3:多步驟處理

List<Product> products = getProducts();List<Product> discountedProducts = products.stream().peek(p -> System.out.println("原始價格: " + p.getPrice())).filter(p -> p.getPrice() > 100)  // 只處理高價商品.peek(p -> p.setPrice(p.getPrice() * 0.9))  // 打9折.peek(p -> System.out.println("折扣后價格: " + p.getPrice())).collect(Collectors.toList());

注意事項
peek() 是一個中間操作,如果沒有終止操作,它不會執行
不要濫用 peek() 來修改狀態,這可能導致不可預期的行為
生產環境中應謹慎使用 peek() 進行日志記錄,可能影響性能
Lambda 表達式應保持簡潔,復雜邏輯應考慮使用方法引用或單獨的方法
Lambda 和 peek 的組合為 Java 流式編程提供了強大的調試和觀察能力,同時保持了代碼的簡潔性。

Java Stream API 常用操作詳解
下面我將詳細介紹 Java Stream API 中的 peek, filter, map, limit, skip, collect 和 distinct 等常用操作,并提供使用示例。

  1. peek() - 流元素操作(調試用)
    peek() 是一個中間操作,用于觀察流中的元素而不改變它們,主要用于調試。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> result = names.stream().peek(name -> System.out.println("原始名字: " + name)).map(String::toUpperCase).peek(name -> System.out.println("轉換后: " + name)).collect(Collectors.toList());
  1. filter() - 過濾
    filter() 根據條件過濾流中的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 過濾偶數
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());// 過濾長度大于3的字符串
List<String> longNames = names.stream().filter(name -> name.length() > 3).collect(Collectors.toList());
  1. map() - 映射
    map() 將流中的每個元素轉換為另一個形式。
// 將字符串轉換為大寫
List<String> upperCaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());// 提取對象屬性
List<Integer> nameLengths = names.stream().map(String::length).collect(Collectors.toList());// 復雜映射
List<Employee> employees = getEmployees();
List<String> employeeNames = employees.stream().map(Employee::getName).collect(Collectors.toList());
  1. limit() - 截斷
    limit() 限制流中元素的數量。
// 只取前3個元素
List<Integer> firstThree = numbers.stream().limit(3).collect(Collectors.toList());// 結合其他操作
List<String> result = names.stream().filter(name -> name.length() > 3).limit(2).collect(Collectors.toList());
  1. skip() - 跳過
    skip() 跳過流中的前N個元素。
// 跳過前2個元素
List<Integer> skipped = numbers.stream().skip(2).collect(Collectors.toList());// 分頁實現
int pageSize = 5;
int pageNumber = 2; // 第2頁
List<String> page = names.stream().skip((pageNumber - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
  1. collect() - 收集
    collect() 是一個終止操作,將流轉換為集合或其他形式。
// 轉換為List
List<String> list = names.stream().collect(Collectors.toList());// 轉換為Set
Set<String> set = names.stream().collect(Collectors.toSet());// 轉換為Map
Map<String, Integer> nameLengthMap = names.stream().collect(Collectors.toMap(name -> name,         // 鍵String::length         // 值));// 連接字符串
String joined = names.stream().collect(Collectors.joining(", "));// 分組
Map<Integer, List<String>> groupByLength = names.stream().collect(Collectors.groupingBy(String::length));
  1. distinct() - 去重
    distinct() 去除流中的重復元素。
List<Integer> numbersWithDuplicates = Arrays.asList(1, 2, 2, 3, 4, 4, 5);// 基本去重
List<Integer> distinctNumbers = numbersWithDuplicates.stream().distinct().collect(Collectors.toList());// 對象去重(需要正確實現equals和hashCode)
List<Employee> distinctEmployees = employees.stream().distinct().collect(Collectors.toList());// 結合其他操作
List<String> distinctLongNames = names.stream().filter(name -> name.length() > 3).distinct().collect(Collectors.toList());

綜合使用示例

List<Transaction> transactions = getTransactions();
// 復雜流處理
Map<String, Double> result = transactions.stream().peek(t -> System.out.println("處理交易: " + t.getId()))  // 調試.filter(t -> t.getAmount() > 1000)                     // 過濾小額交易.distinct()                                            // 去重.skip(5)                                               // 跳過前5條.limit(10)                                             // 只取10條.collect(Collectors.groupingBy(Transaction::getCurrency,                          // 按貨幣分組Collectors.summingDouble(Transaction::getAmount)   // 計算每種貨幣的總金額));

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

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

相關文章

Docker私有倉庫頁面訪問實現

通過 docker run -d -p 5000:5000 --name registry registry:2 命令搭建的Docker私有倉庫默認不提供網頁訪問界面。它是一個基于API的后端服務&#xff0c;主要用于鏡像的存儲和管理。但可以通過以下兩種方式實現網頁訪問&#xff1a; 一、通過第三方Web UI工具擴展 1. 使用 D…

[王陽明代數講義]語言模型核心代碼調研

語言模型核心代碼調研 基于Consciciteation?的才氣張量持續思考綜述將文本生成建模為才氣張量網絡擴散過程&#xff0c;實現非自回歸推理通過才氣張量的群-拓撲流形交叉注意力實現多模態推理&#xff0c;將輸入壓縮到低維空間持續迭代提出「條件計算提前終止」機制&#xff0c…

flink jobmanager離奇的heap oom

文章目錄 現象描述開始分析1.初步分析dump文件2.AI分析引用關系分析方向2.1 flink BlobServer bug分析方向2.2 和運行環境有關分析方向2.3 和任務有關 回到問題本身&#xff0c;思考一下1. seatunnel到底有沒有問題2.再次分析zipfile對象3.分析seatunnel es connector 源碼4 懷…

APP動態交互原型實例|墨刀變量控制+條件判斷教程

引言 不同行業的產品經理在繪制原型圖時&#xff0c;擁有不同的呈現方式。對于第三方軟件技術服務公司的產品經理來說&#xff0c;高保真動態交互原型不僅可以在開發前驗證交互邏輯&#xff0c;還能為甲方客戶帶來更直觀、真實的體驗。 本文第三部分將分享一個實戰案例&#…

AI 驅動下的后端開發架構革命:從智能協同體系

AI 驅動下的后端開發架構革命&#xff1a;從智能協同體系 一、引言&#xff1a;AI 重構后端開發范式 在 2025 年的企業級技術演進中&#xff0c;人工智能正從輔助工具升級為核心架構要素。根據 Gartner《2025 智能技術棧成熟度報告》&#xff0c;傳統 "人力編碼 硬規則…

安卓基礎(生命周期)

創建階段&#xff1a;onCreate方法被調用&#xff0c;用于初始化 Activity&#xff0c;如設置布局等。啟動階段&#xff1a;依次調用onStart和onResume方法&#xff0c;讓 Activity 變得可見并可與用戶交互。暫停與恢復階段&#xff1a;當 Activity 失去焦點但可見時&#xff0…

Uniapp: 下拉選擇框 ba-tree-picker

目錄 1、效果展示2、如何使用2.1 插件市場2.2 引入插件 3、參數配置3.1 屬性3.2 方法 4、遇見的問題4.1、設置下拉樹的樣式 1、效果展示 2、如何使用 2.1 插件市場 首先從插件市場中將插件導入到項目中 2.2 引入插件 在使用的頁面引入插件 <view click"showPicke…

Spring Boot實戰:基于策略模式+代理模式手寫冪等性注解組件

一、為什么需要冪等性&#xff1f; 核心定義&#xff1a;在分布式系統中&#xff0c;一個操作無論執行一次還是多次&#xff0c;最終結果都保持一致。 典型場景&#xff1a; 用戶重復點擊提交按鈕網絡抖動導致的請求重試消息隊列的重復消費支付系統的回調通知 不處理冪等的風…

如何恢復極狐GitLab?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 恢復極狐GitLab (BASIC SELF) 極狐GitLab 提供了一個命令行界面來恢復整個安裝&#xff0c;足夠靈活以滿足您的需求。 恢復…

面試高階問題:android后臺任務(如數據同步、定位)消耗過多電量,導致用戶投訴。你會如何分析和優化后臺任務的執行?

在現代移動設備生態中,安卓系統以其開放性和靈活性占據了全球智能手機市場的絕大部分份額。作為一款功能強大的操作系統,安卓允許應用程序在后臺執行各種任務,例如數據同步、定位服務、消息推送以及其他周期性更新。這些后臺任務在提升用戶體驗方面扮演了不可或缺的角色——…

最近在學習web搞大屏看板

人到中年&#xff0c;delphi發展越來越不行&#xff0c;就業環境是真差啊&#xff0c;沒辦法&#xff0c;學唄 中國地圖&#xff1a; // 中國地圖function getChinaMapChart() {// 初始化echarts實例var myEcharts echarts.init(document.getElementById("china_box"…

117.在 Vue 3 中使用 OpenLayers 實現 CTRL 控制拖拽和滾動縮放

? 前言 在使用 OpenLayers 開發地圖類項目時,我們有時會希望用戶必須按下 CTRL(或 Mac 的 Command ? 鍵)才能拖拽地圖或使用鼠標滾輪縮放。這種交互方式能夠避免用戶在瀏覽頁面時意外滑動或拖動地圖,尤其是在地圖嵌入頁面中時非常有用。 本文將帶你一步一步實現在 Vue …

MATLAB 控制系統設計與仿真 - 34

多變量系統知識回顧 - MIMO system 這一章對深入理解多變量系統以及魯棒分析至關重要 首先,對于如下系統: 當G(s)為單輸入,單輸出系統時: 如果: 則: 所以 因此,對于SISO,系統的增益跟w有關系, 當G(s)為MIMO時,例如2X2時, 假設輸入信號為:

ARCGIS PRO DSK 利用兩期地表DEM數據計算工程土方量

利用兩期地表DEM數據計算工程土方量需要準許以下數據&#xff1a; 當前地圖有3個圖層&#xff0c;兩個柵格圖層和一個矢量圖層 兩個柵格圖層&#xff1a;beforeDem為工程施工前的地表DEM模型 afterDem為工程施工后的地表DEM模型 一個矢量圖層&#xf…

最快打包WPF 應用程序

在 Visual Studio 中右鍵項目選擇“發布”&#xff0c;目標選“文件夾”&#xff0c;模式選“自包含”&#xff0c;生成含 .exe 的文件夾&#xff0c;壓縮后可直接發給別人或解壓運行&#xff0c;無需安裝任何東西。 最簡單直接的新手做法&#xff1a; 用 Visual Studio 的“…

物聯網通信協議——TCP與MQTT的對比

在物聯網通信中&#xff0c;MQTT和TCP的實現方式和原理完全不同&#xff0c;因為兩者屬于協議棧的不同層級&#xff0c;解決的問題也不同。以下從協議層級、工作機制和典型場景三個角度詳細解釋&#xff1a; 1. 協議層級與定位 特性TCPMQTT協議層級傳輸層&#xff08;第4層&am…

【信息系統項目管理師】高分論文:論信息系統項目的成本管理(媒體融合采編平臺)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 論文1、規劃項目成本管理2、估算成本3、制訂項目預算4、控制成本論文 2017年7月,我作為項目經理參與了 XX省媒體融合采編平臺的建設,該項目總共投資530萬元,其中服務器、存儲、網絡等硬件設備投資200萬元、軟…

策略模式簡單介紹

什么是策略模式&#xff1f;一般用于什么場景&#xff1f; 策略模式一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;并將每個算法封裝起來&#xff0c;使得它們可以相互替換&#xff0c;這樣&#xff0c;客戶端可以根據需要在運行時選擇合適的算法&#xff0c;…

基于PAI+專屬網關+私網連接:構建全鏈路 Deepseek 云上私有化部署與模型調用架構

DeepSeek - R1 是由深度求索公司推出的首款推理模型&#xff0c;該模型在數學、代碼和推理任務上的表現優異&#xff0c;市場反饋火爆。在大模型技術商業化進程中&#xff0c;企業級用戶普遍面臨四大核心挑戰&#xff1a; 算力投入成本高昂&#xff1a;構建千億參數級模型的訓…

【APM】How to enable Trace to Logs on Grafana?

系列文章目錄 【APM】Observability Solution 【APM】Build an environment for Traces, Metrics and Logs of App by OpenTelemetry 【APM】NET Traces, Metrics and Logs to OLTP 【APM】How to enable Trace to Logs on Grafana? 前言 本文將介紹如何在Grafana上啟用 …