文章目录
stream求和BigDecimal
BigDecimal result2 = userList.stream()
// 将user对象的mongey取出来map为Bigdecimal
.map(User::getMoney)
// 使用reduce聚合函数,实现累加器
.reduce(BigDecimal.ZERO,BigDecimal::add);
Stream将List转换为Map,使用Collectors.toMap方法进行转换。
Stream将List转为Map,Set汇总拼接key以及分组groupingBy用法
1、指定key-value,value是对象中的某个属性值。
Map<Integer,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User::getName));
2、指定key-value,value是对象本身,User->User 是一个返回本身的lambda表达式
Map<Integer,User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId,User->User));
3、指定key-value,value是对象本身,Function.identity()是简洁写法,也是返回对象本身
Map<Integer,User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
4、指定key-value,value是对象本身,Function.identity()是简洁写法,也是返回对象本身,key 冲突的解决办法,这里选择第二个key覆盖第一个key。
Map<Integer,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(key1,key2)->key2));
5、拼接key->Map
Map<String, Parts> partsMap = synList.stream().collect(Collectors.toMap(k -> k.getOe()+k.getOeId()+k.getPartGroupId()+k.getStdPartId()+k.getBrandCode(), part -> part));
6.提取部门ID集合(Set)
Set deptIds = users.stream().map(User::getDeptId).collect(Collectors.toSet());
List拼接字符串
String ids = UserList.map(e->e.getId()).collect(Collectors.joining(“‘,’”));
提取部门ID集合(List)并去重
List deptIds = users.stream().map(User::getDeptId).distinct().collect(Collectors.toList());
set转list
使用构造函数:
Set<Integer> set = new HashSet<>();
// 添加元素到set
List<Integer> list1 = new ArrayList<>(set);
使用addAll()方法
Set<Integer> set = new HashSet<>();
// 添加元素到set
List<Integer> list2 = new ArrayList<>();
list2.addAll(set);
stream的groupingBy分组
- 单层级分组 : 单个属性分组
- 多层级分组 :分组中带有子分组
- 按子组收集数据
public Product(Long id, Integer num, BigDecimal price, String name, String category) {
this.id = id;
this.num = num;
this.price = price;
this.name = name;
this.category = category;
}
Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
Product prod3 = new Product(3L, 3, new BigDecimal("30"), "月饼", "零食");
Product prod4 = new Product(4L, 3, new BigDecimal("10"), "青岛啤酒", "啤酒");
Product prod5 = new Product(5L, 10, new BigDecimal("15"), "百威啤酒", "啤酒");
List<Product> prodList = Lists.newArrayList(prod1, prod2, prod3, prod4, prod5);
按性别单级分组
//将列表数据按category进行分组
Map<String, List<Product>> categoryMap = prodList.parallelStream()
.collect(Collectors.groupingBy(Product::getCategory));
//使用LinkedHashMap,可以保证分组后顺序不变
Map<String, List<Product>> categoryMap = prodList.parallelStream()
.collect(Collectors.groupingBy(Product::getCategory, LinkedHashMap::new, Collectors.toList()));
多层级分组
我们可以使用一个由双参数版本的Collectors.groupingBy工厂方法创 建的收集器,它除了普通的分类函数之外,还可以接受collector类型的第二个参数。那么要进 行二级分组的话,我们可以把一个内层groupingBy传递给外层groupingBy,并定义一个为流 中项目分类的二级标准。
按类别分组,类别分组内部按num>3分组
Map<String, Map<String, List<Product>>> prodMap= prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.groupingBy(item -> {
if(item.getNum() < 3) {
return "3";
}else {
return "other";
}
})));
分组结果:
{
"啤酒": {
"other": [
{
"category": "啤酒",
"id": 4,
"name": "青岛啤酒",
"num": 3,
"price": 10
},
{
"category": "啤酒",
"id": 5,
"name": "百威啤酒",
"num": 10,
"price": 15
}
]
},
"零食": {
"3": [
{
"category": "零食",
"id": 1,
"name": "面包",
"num": 1,
"price": 15.5
},
{
"category": "零食",
"id": 2,
"name": "饼干",
"num": 2,
"price": 20
}
],
"other": [
{
"category": "零食",
"id": 3,
"name": "月饼",
"num": 3,
"price": 30
}
]
}
}
对List<map>分组
id | name |
---|---|
1 | zhangsan |
1 | zhangsan11 |
2 | zhangsan2 |
2 | zhangsan222 |
public static void main(String[] args) {
List<Map<String,Object>> list=new ArrayList<>();
Map<String,Object> map=new HashMap<>();
map.put("id",1);
map.put("name","zhangsan");
list.add(map);
Map<String,Object> map2=new HashMap<>();
map2.put("id",2);
map2.put("name","wanger");
list.add(map2);
Map<String,Object> map3=new HashMap<>();
map3.put("id",4);
map3.put("name","zhangsan");
list.add(map3);
Map<String,Object> map4=new HashMap<>();
map4.put("id",4);
map4.put("name","lisi");
list.add(map4);
Map<Integer, List<Map<String, Object>>> id = list.stream().collect(Collectors.groupingBy(item -> {
return (int)item.get("id");
}));
id.forEach((k,v)->{
System.err.println("===========");
System.err.println("k的值:"+k);
System.err.println("v的值:");
v.forEach(System.err::println);
});
}
分组结果:
[
1:[
{id:1,name:zhagnhan},{id:1,name:zhagnhan111}
],
2:[
{id:2,name:zhagnhan2},{id:2,name:zhagnhan222}
]
]
按子分组
求和:按分类统计订单数(一个订单算一个)
Map<String, Long> prodMap =
prodList.stream().collect(Collectors.groupingBy(Product::getCategory,
Collectors.counting()));
分组结果:
{
"啤酒": 2,
"零食": 3
}
求和:按分类统计购买的产品数量(一个订单购买了多个)
Map<String, Integer> prodMap =
prodList.stream().collect(Collectors.groupingBy(Product::getCategory,
Collectors.summingInt(Product::getNum)));
分组结果:
{
"啤酒": 13,
"零食": 6
}
筛选:按类型筛选出购买数量最大的订单
把收集器的结果转换为另一种类型
Map<String, Product> prodMap =
prodList.stream().collect(Collectors.groupingBy(Product::getCategory,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Product::getNum)),
Optional::get)));
分组结果:
{
"啤酒": {
"category": "啤酒",
"id": 5,
"name": "百威啤酒",
"num": 10,
"price": 15
},
"零食": {
"category": "零食",
"id": 3,
"name": "月饼",
"num": 3,
"price": 30
}
}
分类组合:按类型分组获取产品名称合并的Set集合
联合其他收集器
Map<String, Set> prodMap =
prodList.stream().collect(Collectors.groupingBy(Product::getCategory,
Collectors.mapping(Product::getName, Collectors.toSet())));
分组结果:
{
"啤酒": [
"青岛啤酒",
"百威啤酒"
],
"零食": [
"面包",
"饼干",
"月饼"
]
}
参考文档
java8新特性之groupingBy的用法
https://blog.csdn.net/CNCDXX_88/article/details/134912054