一、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