Java Stream API

介紹

Java Stream API 是 Java 8 中新引入的一種數據處理方式。它的目標是提供一種簡單、高效、並行的處理集合、數組等數據源的方式,以取代原有的 for 循環和迭代器。Java Stream API 通過使用聚合操作(aggregation operation)操縱數據流,獲取或轉換數據。

前置知識

在深入學習 Java Stream API 之前,我們需要先掌握以下概念:

  • 函數式介面(Functional Interface):函數式介面是只有一個抽象方法的介面。
  • Lambda 表達式:Lambda 表達式 是一種簡潔的,代碼行數少的而且可傳遞的對象,可以將 Lambda 表達式看作一段可以傳遞的代碼。它無需命名,旨在簡化 Java 程序中單一方法的某些語法的編寫。Lambda 方式可以使用 Functional Interface 來實現。

Stream API 的主要特點

Java Stream API 的主要特點可歸結為以下幾點:

  • 內部迭代:Java Stream API 在迭代時會自動選擇並行或順序執行,無需手動進行線程管理。
  • 一次執行:可以對源數據執行各種中間過程和操作,最終只進行一次完成操作。
  • 不可變:Java Stream API 操作的結果是新流,源數據不變。
  • 延遲執行:Java Stream API 的操作是惰性的,只有在最終執行中間過程的操作時才會被執行。

常用操作

篩選操作

篩選操作指的是通過保留或去除元素來篩選出需要的結果。以下是常用的篩選操作。

filter(Predicate)

filter方法接收一個 Predicate 函數式介面作為參數,返回一個只包含符合條件的元素的 Stream。

Stream<T> filter(Predicate<? super T> predicate)

示例:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
Stream<String> filtered = strings.stream().filter(string -> !string.isEmpty());
filtered.forEach(System.out::println); //輸出不為空的字元串,即除了「」之外的字元串

distinct()

distinct方法返回由不同的元素組成的 Stream。

Stream<T> distinct()

示例:

List<Integer> numbers = Arrays.asList(1, 2, 3, 1, 3, 2, 4);
Stream<Integer> distinctNumbers = numbers.stream().distinct();
distinctNumbers.forEach(System.out::println); //輸出不重複的整數

映射操作

映射操作指的是將一個流中的元素映射到另一個流中。以下是常用的映射操作。

map(Function)

map方法用於將元素按照指定的 Function 轉換成另外的元素。Function 函數式介面接收一個參數並返回一個值。

<R> Stream<R> map(Function<? super T, ? extends R> mapper)

示例:

List<String> strings = Arrays.asList("abc", "efg", "qwerty");
Stream<Integer> mapped = strings.stream().map(String::length); //映射字元串的長度
mapped.forEach(System.out::println); //輸出各個字元串的長度

flatMap(Function)

flatMap方法接收一個 Function 函數式介面作為參數,可以將嵌套的 Stream 展平成一個 Stream。

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)

示例:

List<List<String>> list = new ArrayList<>();
list.add(Arrays.asList("apple", "banana"));
list.add(Arrays.asList("orange", "lemon", "grape"));
Stream<String> flatMapped = list.stream().flatMap(Collection::stream);
flatMapped.forEach(System.out::println); //輸出展平後的字元串

排序操作

排序操作指對數據集合進行排序。Java Stream API 提供了兩種方式進行排序:自然排序和定製排序。

sorted()

sorted方法根據自然排序對源集合進行排序。

Stream<T> sorted()

示例:

List<String> strings = Arrays.asList("ccc", "aaa", "bbb", "ddd");
Stream<String> sorted = strings.stream().sorted();
sorted.forEach(System.out::println); //自然排序

sorted(Comparator)

sorted方法根據指定的 Comparator 介面對源集合進行排序。

Stream<T> sorted(Comparator<? super T> comparator)

示例:

List<String> strings = Arrays.asList("ccc", "aaa", "bbb", "ddd");
Stream<String> sorted = strings.stream().sorted((s1,s2)->s1.length()-s2.length());
sorted.forEach(System.out::println); //按字元串長度排序

聚合操作

聚合操作指獲取操作結果的操作,包括歸約、收集等操作。

reduce(T identity, BinaryOperator)

reduce方法接收一個初始值和一個 BinaryOperator(t,t)->t 函數,將集合中的元素逐一與上一個結果進行操作,返回一個包含操作結果的 Optional 對象。

T reduce(T identity, BinaryOperator<T> accumulator)

示例:

List<Integer> numbers = Arrays.asList(1,2,3,4);
Optional<Integer> sum = numbers.stream().reduce(0, (x,y)->x+y); //計算整數的和
sum.ifPresent(System.out::println); //輸出求和的結果

collect(Collector)

collect方法使用 Collectors 工廠類提供的方法將流轉換成集合、映射、字元串等,以操作結果的形式返回。

R collect(Collector<? super T, A, R> collector)

示例:

List<String> strings = Arrays.asList("abc", "def", "ghi");
List<String> collected = strings.stream().filter(s->s.startsWith("a")).collect(Collectors.toList());
collected.forEach(System.out::println); //輸出以「a」開頭的字元串

小結

Java Stream API 通過內部迭代的方式提供了一種高效、並行的數據處理方式,避免了原有的 for 循環和迭代器的繁瑣操作。通過上述常用操作,我們可以方便地對集合、數據進行篩選、映射、排序、聚合等操作,以得到我們預期的結果。通過學習 Java Stream API,我們可以更加輕鬆地對數據進行操作,提高開發效率。

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

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

相關推薦

  • Java JsonPath 效率優化指南

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

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

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

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

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

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

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

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

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

    編程 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
  • 掌握magic-api item.import,為你的項目注入靈魂

    你是否曾經想要導入一個模塊,但卻不知道如何實現?又或者,你是否在使用magic-api時遇到了無法導入的問題?那麼,你來到了正確的地方。在本文中,我們將詳細闡述magic-api的…

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

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

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

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

    編程 2025-04-29

發表回復

登錄後才能評論