最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)List分組的常見(jiàn)方法詳解

 更新時(shí)間:2025年12月23日 08:33:15   作者:悟能不能悟  
這篇文章主要為大家詳細(xì)介紹了使用Java實(shí)現(xiàn)List分組的幾個(gè)常見(jiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

在Java中,對(duì)List進(jìn)行分組有多種方法,以下是常見(jiàn)的幾種方式:

1. 使用 Stream API (Java 8+ 推薦)

1.1 按屬性分組

// 按對(duì)象屬性分組
List<Person> people = Arrays.asList(
    new Person("Alice", "IT"),
    new Person("Bob", "HR"),
    new Person("Charlie", "IT")
);

Map<String, List<Person>> byDept = people.stream()
    .collect(Collectors.groupingBy(Person::getDepartment));

// 復(fù)雜分組:按多個(gè)條件分組
Map<String, Map<Integer, List<Person>>> byDeptAndAge = people.stream()
    .collect(Collectors.groupingBy(
        Person::getDepartment,
        Collectors.groupingBy(Person::getAge)
    ));

1.2 分組后處理

// 分組并計(jì)數(shù)
Map<String, Long> countByDept = people.stream()
    .collect(Collectors.groupingBy(
        Person::getDepartment,
        Collectors.counting()
    ));

// 分組并求和
Map<String, Integer> sumByDept = people.stream()
    .collect(Collectors.groupingBy(
        Person::getDepartment,
        Collectors.summingInt(Person::getSalary)
    ));

// 分組后獲取最大/最小值
Map<String, Optional<Person>> maxByDept = people.stream()
    .collect(Collectors.groupingBy(
        Person::getDepartment,
        Collectors.maxBy(Comparator.comparing(Person::getSalary))
    ));

2. 使用傳統(tǒng)循環(huán)

Map<String, List<Person>> byDept = new HashMap<>();

for (Person person : people) {
    String dept = person.getDepartment();
    byDept.computeIfAbsent(dept, k -> new ArrayList<>())
          .add(person);
}

3. 使用第三方庫(kù)

3.1 Apache Commons Collections

// 添加依賴
// implementation 'org.apache.commons:commons-collections4:4.4'

MultiValuedMap<String, Person> byDept = new ArrayListValuedHashMap<>();
for (Person person : people) {
    byDept.put(person.getDepartment(), person);
}

3.2 Google Guava

// 添加依賴
// implementation 'com.google.guava:guava:31.1-jre'

Multimap<String, Person> byDept = ArrayListMultimap.create();
for (Person person : people) {
    byDept.put(person.getDepartment(), person);
}

// 或者使用流式方式
ImmutableListMultimap<String, Person> grouped = Multimaps.index(
    people, Person::getDepartment
);

4. 完整示例

import java.util.*;
import java.util.stream.Collectors;

class Person {
    private String name;
    private String department;
    private int age;
    private int salary;
    
    // 構(gòu)造方法、getter、setter
    
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", "IT", 25, 5000),
            new Person("Bob", "HR", 30, 4500),
            new Person("Charlie", "IT", 28, 5500),
            new Person("David", "HR", 35, 4800)
        );
        
        // 1. 按部門分組
        Map<String, List<Person>> byDept = people.stream()
            .collect(Collectors.groupingBy(Person::getDepartment));
        
        // 2. 按部門統(tǒng)計(jì)平均工資
        Map<String, Double> avgSalaryByDept = people.stream()
            .collect(Collectors.groupingBy(
                Person::getDepartment,
                Collectors.averagingDouble(Person::getSalary)
            ));
        
        // 3. 按年齡段分組
        Map<String, List<Person>> byAgeGroup = people.stream()
            .collect(Collectors.groupingBy(p -> {
                if (p.getAge() < 30) return "青年";
                else if (p.getAge() < 40) return "中年";
                else return "資深";
            }));
    }
}

5. 自定義分組邏輯

// 自定義分組器
Collector<Person, ?, Map<String, List<Person>>> customGrouping = 
    Collector.of(
        HashMap::new,  // 供應(yīng)者
        (map, person) -> {  // 累加器
            String key = person.getDepartment() + "-" + 
                        (person.getAge() / 10 * 10);  // 按10歲分段
            map.computeIfAbsent(key, k -> new ArrayList<>())
               .add(person);
        },
        (map1, map2) -> {  // 合并器(用于并行流)
            map2.forEach((key, value) -> 
                map1.merge(key, value, (list1, list2) -> {
                    list1.addAll(list2);
                    return list1;
                })
            );
            return map1;
        }
    );

Map<String, List<Person>> customGrouped = people.stream()
    .collect(customGrouping);

6.選擇建議

  • Java 8+:優(yōu)先使用 Stream API+ Collectors.groupingBy(),代碼簡(jiǎn)潔高效
  • 復(fù)雜分組:使用多級(jí)分組或自定義分組邏輯
  • 并行處理:考慮使用并行流 parallelStream()
  • 性能考慮:大數(shù)據(jù)量時(shí)注意選擇合適的 Map 實(shí)現(xiàn)(如 LinkedHashMap 保持順序)

這些方法可以根據(jù)具體需求靈活選擇和使用。

到此這篇關(guān)于Java實(shí)現(xiàn)List分組的常見(jiàn)方法詳解的文章就介紹到這了,更多相關(guān)Java List分組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)教程之構(gòu)造器與方法重載

    Java基礎(chǔ)教程之構(gòu)造器與方法重載

    這篇文章主要介紹了Java基礎(chǔ)教程之構(gòu)造器與方法重載,構(gòu)造器可以初始化數(shù)據(jù)成員,還可以規(guī)定特定的操作,本文還對(duì)方法重載做了介紹,需要的朋友可以參考下
    2014-08-08
  • java字符串如何只保留數(shù)字、字母、中文

    java字符串如何只保留數(shù)字、字母、中文

    這篇文章主要介紹了java字符串如何只保留數(shù)字、字母、中文問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 基于Jenkins自動(dòng)打包并部署docker環(huán)境的操作過(guò)程

    基于Jenkins自動(dòng)打包并部署docker環(huán)境的操作過(guò)程

    這篇文章主要介紹了基于Jenkins自動(dòng)打包并部署docker環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Java文件上傳下載、郵件收發(fā)實(shí)例代碼

    Java文件上傳下載、郵件收發(fā)實(shí)例代碼

    這篇文章主要介紹了Java文件上傳下載、郵件收發(fā)實(shí)例代碼的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • java selenium Selenium IDE介紹及用法

    java selenium Selenium IDE介紹及用法

    本文主要介紹java selenium Selenium IDE,這里整理了相關(guān)資料和介紹如何安裝 Selenium IDE和使用方法,有需要的小伙伴可以參考下
    2016-08-08
  • Java中6種單例模式寫法代碼實(shí)例

    Java中6種單例模式寫法代碼實(shí)例

    這篇文章主要介紹了Java中6種單例模式寫法代碼實(shí)例,某個(gè)類任何情況下只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)來(lái)獲取該實(shí)例,Java6種單例模式有2種懶漢式,2種餓漢式,靜態(tài)內(nèi)部類 ,枚舉類,需要的朋友可以參考下
    2024-01-01
  • Mybatis如何直接執(zhí)行SQL語(yǔ)句

    Mybatis如何直接執(zhí)行SQL語(yǔ)句

    這篇文章主要介紹了Mybatis如何直接執(zhí)行SQL語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java棧之鏈?zhǔn)綏4鎯?chǔ)結(jié)構(gòu)的實(shí)現(xiàn)代碼

    Java棧之鏈?zhǔn)綏4鎯?chǔ)結(jié)構(gòu)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java棧之鏈?zhǔn)綏4鎯?chǔ)結(jié)構(gòu)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • SpringBoot項(xiàng)目啟動(dòng)時(shí)如何讀取配置以及初始化資源

    SpringBoot項(xiàng)目啟動(dòng)時(shí)如何讀取配置以及初始化資源

    這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目啟動(dòng)時(shí)如何讀取配置以及初始化資源的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot 下在 yml 中的 logging 日志配置方法

    SpringBoot 下在 yml 中的 logging 日志配置方法

    logging 配置主要用于控制應(yīng)用程序的日志輸出行為,可以通過(guò)配置定制日志的格式、級(jí)別、輸出位置等,這篇文章主要介紹了SpringBoot 下在 yml 中的 logging 日志配置,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

得荣县| 桃源县| 宾川县| 牡丹江市| 隆林| 噶尔县| 封开县| 临江市| 大悟县| 山阴县| 常山县| 萝北县| 南丹县| 隆林| 安新县| 临漳县| 台南市| 嘉定区| 洞口县| 工布江达县| 桐城市| 南溪县| 安达市| 潍坊市| 宿迁市| 区。| 孟村| 买车| 博罗县| 宣恩县| 南丹县| 洛宁县| 万载县| 肃南| 高碑店市| 武乡县| 佛冈县| 集贤县| 崇信县| 永登县| 万源市|