在 Java 中Lambda 结合 Stream API实现的分片本质就是把一个集合 / 流按照指定规则拆分成多个小集合最核心的两个 API 是Collectors.groupingBy()分组按任意条件分成 N 组key 分组条件value 对应元素列表Collectors.partitioningBy()分区特殊分组只能分成 true/false 两组日常说的「分片」90% 指 groupingBy 分组10% 指 partitioningBy 分区我会用最通俗的语言 实战代码讲透。一、先搞懂什么是 Lambda 分片给你一个集合比如ListStudent你想按年龄分成18 岁一组、19 岁一组、20 岁一组 →groupingBy 分组按是否成年分成成年一组、未成年一组 →partitioningBy 分区这就是Lambda 分片一行代码用流式 Lambda 表达式快速拆分集合不用写循环、if-else。二、核心 API 1Collectors.groupingBy () 【最常用分组分片】1. 作用按照自定义的分类规则Lambda 函数把流分成多个组返回Map分类结果, List原元素。2. 3 种常用用法必掌握1基础分组单条件分片// 实体类 Data AllArgsConstructor class Student { private String name; private int age; private String gender; } // 测试数据 ListStudent list Arrays.asList( new Student(张三, 18, 男), new Student(李四, 19, 男), new Student(王五, 18, 女), new Student(赵六, 19, 女) ); // Lambda 分组分片 // 按年龄分组key年龄value对应学生列表 MapInteger, ListStudent groupByAge list.stream() .collect(Collectors.groupingBy(Student::getAge)); // Lambda 简写 // 等价 Lambda 完整写法 // .collect(Collectors.groupingBy(s - s.getAge()));结果key18 → [张三王五]key19 → [李四赵六]2多级分组嵌套分片先按性别再按年龄// 先按性别分再按年龄分 → 双层 Map MapString, MapInteger, ListStudent multiGroup list.stream() .collect(Collectors.groupingBy( Student::getGender, // 第一层分组性别 Collectors.groupingBy(Student::getAge) // 第二层分组年龄 ));结果男 → {18[张三], 19[李四]}女 → {18[王五], 19[赵六]}3分组 聚合分片后统计数量、总和、平均值分片后不只想要列表还想要每组数量、总和、平均值// 按性别分组统计每组人数 MapString, Long groupCount list.stream() .collect(Collectors.groupingBy( Student::getGender, Collectors.counting() // 聚合计数 )); // 按性别分组统计平均年龄 MapString, Double groupAvgAge list.stream() .collect(Collectors.groupingBy( Student::getGender, Collectors.averagingInt(Student::getAge) // 聚合平均值 ));三、核心 API 2Collectors.partitioningBy () 【分区二分片】1. 作用只能分成两组true一组、false一组返回MapBoolean, List原元素。适用场景只有两种结果的分片是 / 否、通过 / 不通过、成年 / 未成年。2. 实战代码// 按【是否成年】分片true成年false未成年 MapBoolean, ListStudent partition list.stream() .collect(Collectors.partitioningBy(s - s.getAge() 18)); // 获取成年学生 ListStudent adults partition.get(true); // 获取未成年学生 ListStudent minors partition.get(false);3. 特点永远返回两个 keytrue和false哪怕对应列表为空条件必须是返回 boolean 的 Lambda四、groupingBy 和 partitioningBy 对比一看就懂表格特性groupingBy (分组)partitioningBy (分区)分片结果任意 N 组固定 2 组true/false返回类型MapK, ListTMapBoolean, ListTLambda 返回值任意类型对象、数值等必须 boolean空分组不会生成空 key一定有 true/false 两个 key适用场景多条件分类、复杂分片二分类、是非判断五、Lambda 分片的完整实战示例可直接运行import lombok.AllArgsConstructor; import lombok.Data; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class LambdaSplitDemo { public static void main(String[] args) { ListStudent students Arrays.asList( new Student(小明, 17, 男), new Student(小红, 18, 女), new Student(小刚, 19, 男), new Student(小丽, 18, 女) ); // 1. 分组分片按年龄 MapInteger, ListStudent groupByAge students.stream() .collect(Collectors.groupingBy(Student::getAge)); System.out.println(按年龄分组 groupByAge); // 2. 分区分片是否成年 MapBoolean, ListStudent partitionByAdult students.stream() .collect(Collectors.partitioningBy(s - s.getAge() 18)); System.out.println(是否成年分区 partitionByAdult); // 3. 分组统计按性别统计人数 MapString, Long groupCount students.stream() .collect(Collectors.groupingBy(Student::getGender, Collectors.counting())); System.out.println(按性别统计人数 groupCount); } } Data AllArgsConstructor class Student { private String name; private int age; private String gender; }关键记忆点背会就能写代码1. 一句话区分两个分片 API多结果分片→ 用groupingByLambda 返回任意值二结果分片→ 用partitioningByLambda 必须返回 boolean2. 核心语法模板直接套用// 分组分片 Map结果类型, List元素 变量 集合.stream() .collect(Collectors.groupingBy( Lambda 分组条件 )); // 分区分片 MapBoolean, List元素 变量 集合.stream() .collect(Collectors.partitioningBy( Lambda 布尔条件 ));3. 必背 3 个分组聚合用法Collectors.counting()统计每组数量Collectors.summingInt()统计每组数值和Collectors.averagingInt()统计每组平均值4. 核心特性分片是Stream 终止操作必须用collect()接收分组返回Mapkey 是分组条件结果value 是元素列表分区永远有 true/false两个 key分组没有空 keyLambda 写法对象::get方法等价s - s.getXXX()总结Java Lambda 分片 Stream Collectors 分组 / 分区替代繁琐循环groupingBy通用多组分片工作中最常用partitioningBy专用二分片简单场景使用记忆核心多组用 groupingBy二组用 partitioningBy
Java Lambda 分片(分组 / 分区)超详细讲解
在 Java 中Lambda 结合 Stream API实现的分片本质就是把一个集合 / 流按照指定规则拆分成多个小集合最核心的两个 API 是Collectors.groupingBy()分组按任意条件分成 N 组key 分组条件value 对应元素列表Collectors.partitioningBy()分区特殊分组只能分成 true/false 两组日常说的「分片」90% 指 groupingBy 分组10% 指 partitioningBy 分区我会用最通俗的语言 实战代码讲透。一、先搞懂什么是 Lambda 分片给你一个集合比如ListStudent你想按年龄分成18 岁一组、19 岁一组、20 岁一组 →groupingBy 分组按是否成年分成成年一组、未成年一组 →partitioningBy 分区这就是Lambda 分片一行代码用流式 Lambda 表达式快速拆分集合不用写循环、if-else。二、核心 API 1Collectors.groupingBy () 【最常用分组分片】1. 作用按照自定义的分类规则Lambda 函数把流分成多个组返回Map分类结果, List原元素。2. 3 种常用用法必掌握1基础分组单条件分片// 实体类 Data AllArgsConstructor class Student { private String name; private int age; private String gender; } // 测试数据 ListStudent list Arrays.asList( new Student(张三, 18, 男), new Student(李四, 19, 男), new Student(王五, 18, 女), new Student(赵六, 19, 女) ); // Lambda 分组分片 // 按年龄分组key年龄value对应学生列表 MapInteger, ListStudent groupByAge list.stream() .collect(Collectors.groupingBy(Student::getAge)); // Lambda 简写 // 等价 Lambda 完整写法 // .collect(Collectors.groupingBy(s - s.getAge()));结果key18 → [张三王五]key19 → [李四赵六]2多级分组嵌套分片先按性别再按年龄// 先按性别分再按年龄分 → 双层 Map MapString, MapInteger, ListStudent multiGroup list.stream() .collect(Collectors.groupingBy( Student::getGender, // 第一层分组性别 Collectors.groupingBy(Student::getAge) // 第二层分组年龄 ));结果男 → {18[张三], 19[李四]}女 → {18[王五], 19[赵六]}3分组 聚合分片后统计数量、总和、平均值分片后不只想要列表还想要每组数量、总和、平均值// 按性别分组统计每组人数 MapString, Long groupCount list.stream() .collect(Collectors.groupingBy( Student::getGender, Collectors.counting() // 聚合计数 )); // 按性别分组统计平均年龄 MapString, Double groupAvgAge list.stream() .collect(Collectors.groupingBy( Student::getGender, Collectors.averagingInt(Student::getAge) // 聚合平均值 ));三、核心 API 2Collectors.partitioningBy () 【分区二分片】1. 作用只能分成两组true一组、false一组返回MapBoolean, List原元素。适用场景只有两种结果的分片是 / 否、通过 / 不通过、成年 / 未成年。2. 实战代码// 按【是否成年】分片true成年false未成年 MapBoolean, ListStudent partition list.stream() .collect(Collectors.partitioningBy(s - s.getAge() 18)); // 获取成年学生 ListStudent adults partition.get(true); // 获取未成年学生 ListStudent minors partition.get(false);3. 特点永远返回两个 keytrue和false哪怕对应列表为空条件必须是返回 boolean 的 Lambda四、groupingBy 和 partitioningBy 对比一看就懂表格特性groupingBy (分组)partitioningBy (分区)分片结果任意 N 组固定 2 组true/false返回类型MapK, ListTMapBoolean, ListTLambda 返回值任意类型对象、数值等必须 boolean空分组不会生成空 key一定有 true/false 两个 key适用场景多条件分类、复杂分片二分类、是非判断五、Lambda 分片的完整实战示例可直接运行import lombok.AllArgsConstructor; import lombok.Data; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class LambdaSplitDemo { public static void main(String[] args) { ListStudent students Arrays.asList( new Student(小明, 17, 男), new Student(小红, 18, 女), new Student(小刚, 19, 男), new Student(小丽, 18, 女) ); // 1. 分组分片按年龄 MapInteger, ListStudent groupByAge students.stream() .collect(Collectors.groupingBy(Student::getAge)); System.out.println(按年龄分组 groupByAge); // 2. 分区分片是否成年 MapBoolean, ListStudent partitionByAdult students.stream() .collect(Collectors.partitioningBy(s - s.getAge() 18)); System.out.println(是否成年分区 partitionByAdult); // 3. 分组统计按性别统计人数 MapString, Long groupCount students.stream() .collect(Collectors.groupingBy(Student::getGender, Collectors.counting())); System.out.println(按性别统计人数 groupCount); } } Data AllArgsConstructor class Student { private String name; private int age; private String gender; }关键记忆点背会就能写代码1. 一句话区分两个分片 API多结果分片→ 用groupingByLambda 返回任意值二结果分片→ 用partitioningByLambda 必须返回 boolean2. 核心语法模板直接套用// 分组分片 Map结果类型, List元素 变量 集合.stream() .collect(Collectors.groupingBy( Lambda 分组条件 )); // 分区分片 MapBoolean, List元素 变量 集合.stream() .collect(Collectors.partitioningBy( Lambda 布尔条件 ));3. 必背 3 个分组聚合用法Collectors.counting()统计每组数量Collectors.summingInt()统计每组数值和Collectors.averagingInt()统计每组平均值4. 核心特性分片是Stream 终止操作必须用collect()接收分组返回Mapkey 是分组条件结果value 是元素列表分区永远有 true/false两个 key分组没有空 keyLambda 写法对象::get方法等价s - s.getXXX()总结Java Lambda 分片 Stream Collectors 分组 / 分区替代繁琐循环groupingBy通用多组分片工作中最常用partitioningBy专用二分片简单场景使用记忆核心多组用 groupingBy二组用 partitioningBy