Java 8 Stream API

文章目錄

  • Java 8 Stream API
  • 1. Stream
  • 2. Stream 的創建
  • 3. 常見的 Stream 操作
    • 3.1 中間操作
    • 3.2 終止操作
  • 4. Stream 的并行操作

Java 8 Stream API

  • Java 8 引入了 Stream API,使得對集合類(如 ListSet 等)的操作變得更加簡潔和直觀。Stream API 主要目的是為了簡化對集合數據的處理,尤其是支持 函數式編程 風格的操作。
  • Stream 可以讓你使用聲明式的方式進行集合操作,而不是傳統的命令式方式。

1. Stream

  • 在 Java 8 中,Stream 是一個用于處理數據集合(如 ListSetMap 等)的工具,它允許你在不修改集合本身的情況下,通過一系列的操作(如過濾、映射、聚合等)來對數據進行處理。
  • Stream 是一個流式的、單向的數據結構,意味著你一次只能處理流中的一個元素,且每次處理后的流會產生新的流對象,原始流不會發生改變。

2. Stream 的創建

Stream 可以通過以下幾種方式創建:

  • 從集合創建 Stream

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    Stream<String> stream = list.stream();
    
  • 從數組創建 Stream

    String[] array = {"apple", "banana", "cherry"};
    Stream<String> stream = Arrays.stream(array);
    
  • 使用 Stream.of() 創建 Stream

    Stream<String> stream = Stream.of("apple", "banana", "cherry");
    

3. 常見的 Stream 操作

  • Stream API 提供了兩類操作:中間操作終止操作

3.1 中間操作

  • 中間操作是惰性操作(Lazy),它們不會立即執行,直到你觸發一個終止操作時,才會開始執行整個流的計算。常見的中間操作包括:

  • filter:用于過濾流中的元素,返回符合條件的元素。

    List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
    List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
    System.out.println(filteredList); // 輸出: [apple]
    
  • map:用于將流中的元素通過函數轉換成另一個類型的元素(通常是映射操作)。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    List<String> upperCaseList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
    System.out.println(upperCaseList); // 輸出: [APPLE, BANANA, CHERRY]
    
  • distinct:去除重復的元素。

    List<String> list = Arrays.asList("apple", "banana", "apple", "cherry");
    List<String> distinctList = list.stream().distinct().collect(Collectors.toList());
    System.out.println(distinctList); // 輸出: [apple, banana, cherry]
    
  • sorted:對流中的元素進行排序。

    List<String> list = Arrays.asList("banana", "apple", "cherry");
    List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
    System.out.println(sortedList); // 輸出: [apple, banana, cherry]
    
  • flatMap:將流中的每個元素映射成多個元素,然后再將所有這些元素合并成一個流。

    List<List<String>> listOfLists = Arrays.asList(Arrays.asList("apple", "banana"),Arrays.asList("cherry", "date"));List<String> flatMappedList = listOfLists.stream().flatMap(List::stream).collect(Collectors.toList());
    System.out.println(flatMappedList); // 輸出: [apple, banana, cherry, date]
    

3.2 終止操作

終止操作是激活流計算的操作,調用終止操作時流會開始遍歷并進行計算。常見的終止操作包括:

  • collect:將流中的元素收集到集合中,是最常用的終止操作。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    List<String> result = list.stream().collect(Collectors.toList());
    System.out.println(result); // 輸出: [apple, banana, cherry]
    
  • forEach:對流中的每個元素進行操作,通常用于打印。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    list.stream().forEach(System.out::println);
    // 輸出:
    // apple
    // banana
    // cherry
    
  • reduce:用于對流中的元素進行累加或合并,通常用于求和、求最小值或求最大值。

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = numbers.stream().reduce(0, Integer::sum);
    System.out.println(sum); // 輸出: 15
    
  • anyMatch:檢查流中的任何一個元素是否符合指定的條件。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    boolean hasApple = list.stream().anyMatch(s -> s.equals("apple"));
    System.out.println(hasApple); // 輸出: true
    
  • allMatch:檢查流中的所有元素是否符合指定的條件。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    boolean allStartWithA = list.stream().allMatch(s -> s.startsWith("a"));
    System.out.println(allStartWithA); // 輸出: false
    
  • count:計算流中元素的數量。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    long count = list.stream().count();
    System.out.println(count); // 輸出: 3
    

4. Stream 的并行操作

  • Stream 還提供了并行流,它可以將計算任務分配給多個線程以加速處理。在調用 parallel() 方法后,流的操作會在多個線程中并行執行,從而提高大數據量處理的性能。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sum = numbers.parallelStream().reduce(0, Integer::sum);
System.out.println(sum); // 輸出: 21
  • 并行流適用于數據量較大的場景,但在小數據集下可能會由于線程管理的開銷而降低性能。因此,是否使用并行流需要根據具體情況判斷。

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

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

相關文章

運行fastGPT 第五步 配置FastGPT和上傳知識庫 打造AI客服

運行fastGPT 第五步 配置FastGPT和上傳知識庫 打造AI客服 根據上一步的步驟&#xff0c;已經調試了ONE API的接口&#xff0c;下面&#xff0c;我們就登陸fastGPT吧 http://xxx.xxx.xxx.xxx:3000/ 這個就是你的fastGPT后臺地址&#xff0c;可以在configer文件中找到。 賬號是…

第4章 Kafka核心API——Kafka客戶端操作

Kafka客戶端操作 一. 客戶端操作1. AdminClient API 一. 客戶端操作 1. AdminClient API

【王樹森搜索引擎技術】相關性02:評價指標(AUC、正逆序比、DCG)

相關性的評價指標 Pointwise評價指標&#xff1a;Area Under the Curve&#xff08;AUC&#xff09;Pairwise評價指標&#xff1a;正逆序比&#xff08;Positive to Negative Ratio, PNR&#xff09;Listwise評價指標&#xff1a;Discounted Cumulative Gain(DCG)用AUC和PNR作…

人物一致性訓練測評數據集

1.Pulid 訓練:由1.5M張從互聯網收集的高質量人類圖像組成,圖像標題由blip2自動生成。 測試:從互聯網上收集了一個多樣化的肖像測試集,該數據集涵蓋了多種膚色、年齡和性別,共計120張圖像,我們稱之為DivID-120,作為補充資源,還使用了最近開源的測試集Unsplash-50,包含…

Android 項目依賴沖突問題:Duplicate class found in modules

問題描述與處理處理 1、問題描述 plugins {id com.android.application }android {compileSdk 34defaultConfig {applicationId "com.my.dialog"minSdk 21targetSdk 34versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.run…

計算機網絡 | 什么是公網、私網、NAT?

關注&#xff1a;CodingTechWork 引言 計算機網絡是現代信息社會的基石&#xff0c;而網絡通信的順暢性和安全性依賴于有效的IP地址管理和網絡轉換機制。在網絡中&#xff0c;IP地址起到了標識設備和進行數據傳輸的核心作用。本文將詳細討論公網IP、私網IP以及NAT轉換等網絡技…

python+django+Nacos實現配置動態更新-集中管理配置(實現mysql配置動態讀取及動態更新)

一、docker-compose.yml 部署nacos服務 version: "3" services:mysql:container_name: mysql# 5.7image: mysql:5.7environment:# mysql root用戶密碼MYSQL_ROOT_PASSWORD: rootTZ: Asia/Shanghai# 初始化數據庫(后續的初始化sql會在這個庫執行)MYSQL_DATABASE: nac…

深度學習項目--基于LSTM的火災預測研究(pytorch實現)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 前言 LSTM模型一直是一個很經典的模型&#xff0c;這個模型當然也很復雜&#xff0c;一般需要先學習RNN、GRU模型之后再學&#xff0c;GRU、LSTM的模型講解將…

基于 WEB 開發的汽車養護系統設計與實現

標題:基于 WEB 開發的汽車養護系統設計與實現 內容:1.摘要 本文介紹了基于 WEB 開發的汽車養護系統的設計與實現。文章首先闡述了系統的背景和目的&#xff0c;即隨著汽車保有量的增加&#xff0c;汽車養護需求日益增長&#xff0c;傳統的汽車養護方式已經無法滿足人們的需求&…

GitLab集成Jira

GitLab與Jira集成的兩種方式 GitLab 提供了兩種 Jira 集成&#xff0c;即Jira議題集成和Jira開發面板集成&#xff0c;可以配置一個或者兩個都配置。 具體集成步驟可以參考官方文檔Jira 議題集成&#xff08;極狐GitLab文檔&#xff09;和Jira 開發面板集成&#xff08;極狐G…

【爬蟲】某某查cookie逆向

代碼僅供技術人員進行學習和研究使用&#xff0c;請勿將其用于非法用途或以任何方式竊取第三方數據。使用該代碼產生的所有風險均由用戶自行承擔&#xff0c;作者不對用戶因使用該代碼而造成的任何損失或損害承擔任何責任。 加密參數 加密參數主要是cookie&#xff0c;其中只有…

A5.Springboot-LLama3.2服務自動化構建(二)——Jenkins流水線構建配置初始化設置

下面我們接著上一篇文章《A4.Springboot-LLama3.2服務自動化構建(一)——構建docker鏡像配置》繼續往下分析,在自動化流水線構建過程當中的相關初始化設置和腳本編寫。 一、首先需要先安裝Jenkins 主部分請參考我前面寫的一篇文章《Jenkins持續集成與交付安裝配置》 二、…

如何設置HTTPS站點防御?

設置HTTPS站點防御涉及到多個層面的安全措施&#xff0c;包括但不限于配置Web服務器、應用安全頭信息、使用內容安全策略&#xff08;CSP&#xff09;、啟用HSTS和OCSP Stapling等。下面是一些關鍵的步驟來增強HTTPS網站的安全性&#xff1a; 1. 使用強加密協議和密鑰交換算法…

[Java]類和對象

1. 什么是類&#xff1f; 類&#xff08;Class&#xff09;是藍圖或者模板。它定義了對象的屬性和行為。 類就是一種抽象的模板&#xff0c;你可以通過它創建多個對象。類定義了對象的屬性&#xff08;變量&#xff09;和行為&#xff08;方法&#xff09;。我們可以把類理解…

win32匯編環境,窗口程序中基礎列表框的應用舉例

;運行效果 ;win32匯編環境,窗口程序中基礎列表框的應用舉例 ;比如在窗口程序中生成列表框&#xff0c;增加子項&#xff0c;刪除某項&#xff0c;取得指定項內容等 ;直接抄進RadAsm可編譯運行。重點部分加備注。 ;以下是ASM文件 ;>>>>>>>>>>>…

【機器學習實戰入門】使用LSTM機器學習預測股票價格

機器學習在股票價格預測中有重要的應用。在這個機器學習項目中&#xff0c;我們將討論如何預測股票的收益。這是一個非常復雜的任務&#xff0c;充滿了不確定性。我們將會把這個項目分成兩部分進行開發&#xff1a; 首先&#xff0c;我們將學習如何使用 LSTM 神經網絡預測股票…

【編程語言】C/C++語言常見標準和規范

C/C 是兩種功能強大且廣泛使用的編程語言。盡管它們沒有像 Java 那樣強制性的命名規則&#xff0c;但為了提高代碼的可讀性和可維護性&#xff0c;遵循一些普遍認同的編程規范和標準仍然是非常重要的。本文將探討 C/C 編程中的一些命名規范及標準&#xff0c;以幫助開發者編寫更…

使用C語言實現棧的插入、刪除和排序操作

棧是一種后進先出(LIFO, Last In First Out)的數據結構,這意味著最后插入的元素最先被刪除。在C語言中,我們可以通過數組或鏈表來實現棧。本文將使用數組來實現一個簡單的棧,并提供插入(push)、刪除(pop)以及排序(這里采用一種簡單的排序方法,例如冒泡排序)的操作示…

08、如何預防SQL注入

目錄 1、分析及其存在哪些危險 2、預防SQL注入 1、分析及其存在哪些危險 原理: SQL 注入是一種常見的網絡攻擊手段,攻擊者通過在用戶輸入中插入惡意的 SQL 語句,利用程序對用戶輸入處理不當的漏洞,使惡意 SQL 語句被數據庫服務器執行。 通常發生在應用程序將用戶輸入直接拼…

【爬蟲】使用 Scrapy 框架爬取豆瓣電影 Top 250 數據的完整教程

前言 在大數據和網絡爬蟲領域&#xff0c;Scrapy 是一個功能強大且廣泛使用的開源爬蟲框架。它能夠幫助我們快速地構建爬蟲項目&#xff0c;并高效地從各種網站中提取數據。在本篇文章中&#xff0c;我將帶大家從零開始使用 Scrapy 框架&#xff0c;構建一個簡單的爬蟲項目&am…