Java 对list 进行group

本文介绍如何在Java编程中,利用StreamAPI的collect和groupingBy方法,避免for循环直接处理List,将数据暂存Map中,从而简化代码实现更高的编程效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 不需要通过for 循环对List进行判断,暂存在map,让coding更加simple。

Map<String,List<Item>> invMap = 
inst.stream().collect(Collectors.groupingBy(Inm::getncy));

first Group   then     counting 统计数量

list.stream().collect(Collectors.
groupingBy(item->item.getIhInvNo(),Collectors.counting())).
forEach((key,value)->{
			System.out.println(key);
			System.out.println(value);
});;


结果:


1
S2400002951
3
S400002952
3

Group  --> Map ---> value 降序

Java中,List集合可以利用Stream API的`groupingBy()`方法来模拟MySQL的GROUP BY功能。这个方法用于按照指定函数(如函数`classifier`)将元素分类到不同的key-value映射中。下面是如何使用它: **1. 基础使用** ```java // 示例List List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("aaa"); list.add("aaa"); list.add("ccc"); list.add("bbb"); // 使用Function进行分组 Map<String, List<String>> groupedList = list.stream() .collect(Collectors.groupingBy(String::valueOf)); // classifier: 对每个元素应用String.valueOf()转换为key // 结果将是{'aaa': [aaa, aaa, aaa], 'bbb': [bbb, bbb], 'ccc': [ccc]} System.out.println(groupedList); ``` 在这个例子中,`classifier`函数将元素转化为字符串,然后按字符串值进行分组。 **2. Java 8 `groupingBy`的高级用法** 如果你需要创建一个`Map<K, List<T>>`结构,你可以直接传递`Collectors.toList()`给`groupingBy`的第二个参数,就像这样: ```java // 更高级的版本 Map<String, List<ShopCar>> shopCarsGroupedByCategory = menu.stream() .collect(Collectors.groupingBy(Dish::getCategory, Collectors.toList())); ``` 这里假设`Dish`类有一个`getCategory()`方法返回菜品类别,`menu`是包含`Dish`对象的列表。 **3. 源码分析** 原始的`groupingBy`方法签名接收一个`Function`作为参数,如果只指定一个参数,那么默认的结果类型是`Map<K, List<T>>`。源码显示的简化版`groupingBy(Function)`实际上会调用`toList()`方法来创建内部列表(@1处)。 **4. Joining** `Joining`通常用于连接两个流的数据,而`groupingBy`主要用于分组。它们是互补的操作,在实际场景中可能会一起使用,但这里是分开讨论的。 **相关问题--:** 1. 如何在Java中使用`Collectors.joining()`操作? 2. 在分组的基础上,如何进一步处理每个子列表(比如合并或计算统计信息)? 3. 如果我想改变`groupingBy`的默认结果类型,该怎么做?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值