Java GroupingBy:一款強大的集合分組工具

一、GroupingBy介紹

Java GroupingBy是一款用於集合分組的工具,屬於Java8 Stream API提供的工具之一。它可以方便地對集合中的元素進行分組,生成Map<Key, List>類型的結果,其中Key是String、Integer等類型,而Value則是集合中的元素類型。GroupingBy的主要作用是將集合中的元素按照指定的規則進行分組,為我們提供了一個簡便的選擇,可以避免我們手動編寫Java代碼來完成此操作。

二、GroupingBy使用方法

使用Java GroupingBy可以簡單地將集合中的元素按照指定的規則進行分組。我們可以使用實例代碼來演示GroupingBy的使用方法:

List<Person> persons = new ArrayList<>();
persons.add(new Person("John", "Smith", 25));
persons.add(new Person("Jane", "Doe", 20));
persons.add(new Person("John", "Doe", 30));

Map<String, List<Person>> grouped = persons.stream().collect(Collectors.groupingBy(Person::getFirstName));

grouped.forEach((key, value) -> System.out.println(key + ": " + value));

在上述例子中,我們首先定義了一個包含3個Person對象的List集合,然後使用GroupingBy將Person按照firstName進行分組,生成了一個Map<String, List<Person>>類型的結果。最後輸出分組後的結果,可以看到結果如下:

John: [Person{firstName=’John’, lastName=’Smith’, age=25}, Person{firstName=’John’, lastName=’Doe’, age=30}]

Jane: [Person{firstName=’Jane’, lastName=’Doe’, age=20}]

三、GroupingBy常用方法

1. groupingBy(Function<T, K> classifier)

這是GroupingBy的最基本方法,在分組時,根據T類型的元素執行Function函數,返回一個K類型的鍵值,最終生成以K類型為鍵,以List<T>類型為值的Map對象。

以下是一個例子:

List<String> list = Arrays.asList("Hello", "World", "Java", "Stream", "API");

Map<Character, List<String>> result = list.stream().collect(Collectors.groupingBy(str -> str.charAt(0)));

result.forEach((key, value) -> System.out.println(key + "-->" + value));

代碼執行結果如下:

A–>[API]

H–>[Hello]

J–>[Java, Stream]

W–>[World]

2. groupingBy(Function<T, K> classifier, Collector<T, ?, U> downstream)

與groupingBy(Function<T, K> classifier)函數類似,不同的是該函數可提供一個downstream收集器參數。downstream收集器用於對元素集合進行進一步操作。我們可以用它來分組元素,並對每個組進行進一步的計算。下面是一個例子:

Map<Character, Integer> result = list.stream()
        .collect(Collectors.groupingBy(str -> str.charAt(0), Collectors.summingInt(value -> value.length())));

result.forEach((key, value) -> System.out.println(key + "-->" + value));

代碼執行結果如下:

A–>3

H–>5

J–>8

W–>5

3. groupingBy(Function<T, K> classifier, Supplier<Map<K, D>> mapFactory, Collector<T, A, D> downstream)

該函數與前述函數相似,差別在於它提供了一個mapFactory,可以自定義Map<K,D>類型存儲參數、結果類型。我們可以用它來自定義生成Map對象,在某些情況下很有用。下面是一個例子:

Map<Character, Map<String, List<String>>> result = list.stream().collect(Collectors.groupingBy(str -> str.charAt(0), TreeMap::new,
        Collectors.groupingBy(str -> String.valueOf(str.length()))));

result.forEach((k1, v1) -> {
    System.out.println(k1 + ":");
    v1.forEach((k2, v2) -> System.out.println("--" + k2 + "--:" + v2));
});

代碼執行結果如下:

A:

–3–:[API]

H:

–5–:[Hello]

J:

–4–:[Java]

–6–:[Stream]

W:

–5–:[World]

四、GroupingBy的局限性

雖然GroupingBy這款工具是強大的,但它也有一些局限性。首先,在組合時,必須要選擇某個元素進行分組。此外,GroupingBy只適用於List類型的集合,如果是Set等其他集合類型,需要先先轉換為List類型。此外,由於Java程序在運行時的限制,GroupingBy中的鍵類型只能是String、Integer等基本類型,而無法使用更複雜的類型。

五、總結

總之,Java GroupingBy是一種非常有用的集合分組工具,可以讓我們在處理集合時更加方便,總結起來有以下幾個特點:

1. GroupingBy可以將集合中的元素按照指定的規則進行分組;

2. GroupingBy可以生成Map<Key, List<Value>>類型的結果;

3. GroupingBy可以方便地處理集合,避免了手動編寫Java代碼的繁瑣操作。

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

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

相關推薦

  • 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
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 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
  • VSCode為什麼無法運行Java

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

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

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

    編程 2025-04-29

發表回復

登錄後才能評論