jdk8对list进行分组操作
1. 数据准备:
public class TestGroupBy {
@Data
public static class User {
private Integer id;
private Integer schoolId;
private String userName;
private String edu;
private double price;
}
public static List<TestListToMap.User> users = new ArrayList<>();
static {
TestListToMap.User u1 = new TestListToMap.User();
u1.setId(1001);
u1.setSchoolId(100);
u1.setUserName("小1");
u1.setEdu("001");
u1.setPrice(0.01);
TestListToMap.User u2 = new TestListToMap.User();
u2.setId(1002);
u2.setSchoolId(100);
u2.setUserName("小2");
u2.setEdu("002");
u2.setPrice(0.20);
TestListToMap.User u3 = new TestListToMap.User();
u3.setId(2010);
u3.setSchoolId(200);
u3.setUserName("小3");
u3.setEdu("001");
u3.setPrice(3.00);
TestListToMap.User u4 = new TestListToMap.User();
u4.setId(3001);
u4.setSchoolId(300);
u4.setEdu("001");
u4.setPrice(40.0);
users.add(u1);
users.add(u2);
users.add(u3);
users.add(u4);
}
}
对List进行分组,也可以理解为将List转换为Map集合。
若想将返回的结果映射为不同的集合。
public static void main(String[] args) {
List<String> lists=new ArrayList<>();
lists.add("a");
lists.add("b");
lists.add("a");
lists.add("a");
//将最终结果映射为LinkedHashSet结构。
LinkedHashSet<String> collect = lists.stream().
collect(Collectors.toCollection(LinkedHashSet::new));
System.out.println(collect);
}
2. group by的重载方法
group by生成一个拥有分组功能的Collector,有三个重载方法。
- 需要一个参数:按照该参数进行分组。结果返回一个Map集合,每个Map的key默认是分组参数的类型,value是一个List集合。
public void test1() {
Map <String,List < User >> collect = users.stream().collect(Collectors.groupingBy(User: :getEdu));
}
- 需要两个参数:第二参数是Collector类型,可以对value进行处理。
2.1 可以对结果进行映射
public void test2() {
Map <String,List <Integer>> collect = users.stream().collect(Collectors.groupingBy(User: :getEdu,
//第二个参数对Map的value进行处理(映射)
Collectors.mapping(User: :getId, Collectors.toList())));
}
2.2 可以对结果进行求和
public static void test3() {
Map <String,Double> collect = users.stream().collect(Collectors.groupingBy(User: :getEdu,
//对参数进行累计求和
Collectors.summingDouble(User: :getPrice)));
System.out.println(collect);
}
2.3 对结果的统计
public static void test4() {
Map < String,Long > collect = users.stream().collect(Collectors.groupingBy(User: :getEdu,
//获取count数量
Collectors.counting()));
System.out.println(collect);
}
- 需要三个参数,第三个参数添加了对结果Map的生成方式,默认是HashMap
public static void test3() {
Map <String,Double > collect = users.stream().collect(Collectors.groupingBy(User: :getEdu,
//决定map的生成方式,使用TreeMap
TreeMap: :new,
//对参数进行累计求和
Collectors.summingDouble(User: :getPrice)));
System.out.println(collect);
}
作者:小胖学编程
链接:https://www.jianshu.com/p/60390d9c3301/
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
个人学习笔记,记录日常学习,便于查阅及加深,仅为方便个人使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)