Java Stream操作簡介

Java Stream是Java 8新引入的一種處理集合數據的方式。相較於傳統的集合處理方式,Java Stream操作簡單、易讀、易寫,並且更為高效。

一、Stream的定義

Stream是Java 8中新增的一個概念,可以理解為「數據的生產線」。「生產線」的源頭是一個數據源,例如集合、數組、I/O資源等。中間的每一個環節都會對數據進行加工,最後輸出結果。Stream支持一系列的中間操作和最終操作,中間操作用於加工數據並可以返回一個新的Stream對象,最終操作會觸發中間操作鏈的執行並輸出結果。

二、Stream的創建

在Java 8中,Stream的創建方式有如下幾種:

1. 通過Collection介面的默認方法stream()獲取Stream對象


List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
Stream<String> stream = list.stream();

2. 通過Arrays中的靜態方法stream()獲取Stream對象


String[] array = new String[]{"Java", "Python", "PHP", "Ruby"};
Stream<String> stream = Arrays.stream(array);

3. 通過Stream中的靜態方法of()獲取Stream對象


Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");

4. 通過生成無限長度的Stream

Stream提供了兩種方法來生成無限長度的Stream:

(1) 迭代

Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);

這裡的iterate方法接收一個初始值和一個Lambda表達式,用於生成之後的元素。這裡的n -> n + 2表示每個元素都是上一個元素加2,limit方法則是將Stream流限制在了10個元素以內。

(2) 生成

Stream<Double> stream = Stream.generate(Math::random).limit(10);

這裡的generate接收一個Supplier類型的Lambda表達式,表示每個元素都是supplier提供的隨機數。同樣,limit方法也將Stream流限制在了10個元素以內。

三、Stream的中間操作

Stream提供了大量的中間操作,這裡只介紹其中的一部分。

1. filter()

filter方法用於篩選元素,其接收一個Lambda表達式作為參數,表示只保留滿足條件的元素。例如,篩選出所有長度大於3的元素:


Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
Stream<String> filteredStream = stream.filter(s -> s.length() > 3);

2. map()

map方法用於將元素映射為另一個元素。其接收一個Function類型的Lambda表達式作為參數,表示對每個元素都進行映射操作。例如,將所有元素轉換為大寫:


Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
Stream<String> mappedStream = stream.map(String::toUpperCase);

3. flatMap()

flatMap方法用於將每個元素映射為一個Stream對象,並將所有Stream對象合併為一個Stream對象。其接收一個Function類型的Lambda表達式作為參數,表示將元素映射為一個Stream對象。例如,將每個元素按照空格分割為多個單詞,然後將所有單詞合併為一個Stream對象:


Stream<String> stream = Stream.of("Java is cool", "Python is power", "PHP is amazing", "Ruby is fun");
Stream<String> flatMappedStream = stream.flatMap(s -> Arrays.stream(s.split(" ")));

四、Stream的最終操作

最終操作用於觸發中間操作鏈的執行,並輸出結果。

1. forEach()

forEach方法接收一個Consumer類型的Lambda表達式作為參數,表示對每個元素進行操作。例如,輸出每個元素:


List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
list.stream().forEach(System.out::println);

2. toArray()

toArray方法將Stream流轉換為數組。例如,將所有元素轉換為大寫並轉為數組:


Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
String[] array = stream.map(String::toUpperCase).toArray(String[]::new);

3. reduce()

reduce方法接收一個BinaryOperator類型的Lambda表達式作為參數,表示對Stream中的所有元素進行累加操作。例如,求和操作:


Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
int sum = stream.reduce(0, (a, b) -> a + b);

五、Stream的並行處理

Stream還支持並行處理,比如使用parallel()方法將Stream轉換為並行流,可以更快的處理大數據量的集合。


List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
list.parallelStream().forEach(System.out::println);

六、總結

Java Stream提供了一種簡單、易讀、易寫的集合操作方式。通過Stream的中間操作和最終操作,可以更加靈活的處理集合數據。同時,Stream還支持並行處理,可以更加高效的處理大數據量的集合。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236382.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 11:59
下一篇 2024-12-12 11:59

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論