java  stream()方法

本文展示了如何使用JavaStreamAPI进行数据分组,包括按单一属性、多个属性组合、条件判断进行分组,以及在分组基础上进行计数和求和等聚合操作。示例中涉及了List到Map的转换,以及对BBuildDept对象的处理。
摘要由CSDN通过智能技术生成

//集合分组

按照类别分组

Map<String, List<Product>> map1 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory));
//列子
List<BBuildDept> listDept=new ArrayList();
    BBuildDept dept = new BBuildDept();
    dept.setAddress("玉溪");
    dept.setCode("1");
    listDept.add(dept);
    
    BBuildDept dept1 = new BBuildDept();
    dept1.setAddress("红塔区");
    dept1.setCode("11");
    listDept.add(dept1);
    
    BBuildDept dept2 = new BBuildDept();
    dept2.setAddress("玉溪");
    dept2.setCode("11");
    listDept.add(dept2);
    
    
    Map<String, List<BBuildDept>> map1 = listDept.stream().collect(Collectors.groupingBy(BBuildDept::getAddress));
    
    System.out.println(JSON.toJSONString(listDept));  
    System.out.println(JSON.toJSONString(map1)); 
//输出
[{"address":"玉溪","code":"1"},{"address":"红塔区","code":"11"},{"address":"玉溪","code":"11"}]
{"红塔区":[{"address":"红塔区","code":"11"}],"玉溪":[{"address":"玉溪","code":"1"},{"address":"玉溪","code":"11"}]}

按照多个属性拼接分组

Map<String, List<Product>> map2 = prodList.stream().collect(Collectors.groupingBy(item -> item.getCategory() + "_" + item.getName()));

    List<BBuildDept> listDept=new ArrayList();
    BBuildDept dept = new BBuildDept();
    dept.setAddress("玉溪");
    dept.setCode("1");
    listDept.add(dept);
    
    BBuildDept dept1 = new BBuildDept();
    dept1.setAddress("红塔区");
    dept1.setCode("11");
    listDept.add(dept1);
    
    BBuildDept dept2 = new BBuildDept();
    dept2.setAddress("玉溪");
    dept2.setCode("11");
    listDept.add(dept2);
    
    
    Map<Object, List<BBuildDept>> map1 = listDept.stream().collect(Collectors.groupingBy(item -> item.getAddress() + "_" + item.getCode()));
    System.out.println(JSON.toJSONString(listDept));  
    System.out.println(JSON.toJSONString(map1));  
[{"address":"玉溪","code":"1"},{"address":"红塔区","code":"11"},{"address":"玉溪","code":"11"}]
{"玉溪_11":[{"address":"玉溪","code":"11"}],"玉溪_1":[{"address":"玉溪","code":"1"}],"红塔区_11":[{"address":"红塔区","code":"11"}]}

根据不同条件分组

Map<String, List<Product>> map3 = prodList.stream().collect(Collectors.groupingBy
(item -> {   
 if (item.getNum() > 3) {
        return "num大于3";
    } else if (item.getNum() < 3) {
        return "num小于3";
    } else {
        return "num等于3";
    }
}));
//列子
List<BBuildDept> listDept=new ArrayList();
    BBuildDept dept = new BBuildDept();
    dept.setAddress("玉溪");
    dept.setCode("1");
    dept.setNum(1);
    listDept.add(dept);
    
    BBuildDept dept1 = new BBuildDept();
    dept1.setAddress("红塔区");
    dept1.setCode("11");
    dept1.setNum(3);
    listDept.add(dept1);
    
    BBuildDept dept2 = new BBuildDept();
    dept2.setAddress("玉溪");
    dept2.setCode("11");
    dept2.setNum(4);
    listDept.add(dept2);
    
    
    Map<Object, List<BBuildDept>> map1= listDept.stream().collect(Collectors.groupingBy
            (item -> {   
                 if (item.getNum() > 3) {
                        return "num大于3";
                    } else if (item.getNum() < 3) {
                        return "num小于3";
                    } else {
                        return "num等于3";
                    }
                }));
System.out.println(JSON.toJSONString(listDept));  
    System.out.println(JSON.toJSONString(map1));  
[{"address":"玉溪","code":"1","num":1},{"address":"红塔区","code":"11","num":3},{"address":"玉溪","code":"11","num":4}]
{"num小于3":[{"address":"玉溪","code":"1","num":1}],"num等于3":[{"address":"红塔区","code":"11","num":3}],"num大于3":[{"address":"玉溪","code":"11","num":4}]}

多级分组

Map<String, Map<String, List<Product>>> map4 = prodList.stream().collect(
Collectors.groupingBy(Product::getCategory, Collectors.groupingBy(item -> {
            if (item.getNum() >= 8) {
                return "num大于等于8";
            } else {
                return "num小于8";
            }
        })));
//列子
List<BBuildDept> listDept=new ArrayList();
    BBuildDept dept = new BBuildDept();
    dept.setAddress("玉溪");
    dept.setCode("1");
    dept.setNum(1);
    listDept.add(dept);
    
    BBuildDept dept1 = new BBuildDept();
    dept1.setAddress("红塔区");
    dept1.setCode("11");
    dept1.setNum(3);
    listDept.add(dept1);
    
    BBuildDept dept2 = new BBuildDept();
    dept2.setAddress("玉溪");
    dept2.setCode("11");
    dept2.setNum(4);
    listDept.add(dept2);
    
    
    Map<String, Map<Object, List<BBuildDept>>> map1= listDept.stream().collect(
            Collectors.groupingBy(BBuildDept::getAddress, Collectors.groupingBy(item -> {
                if (item.getNum() >= 3) {
                    return "num大于等于3";
                } else {
                    return "num小于3";
                }
            })));
    System.out.println(JSON.toJSONString(listDept));  
    System.out.println(JSON.toJSONString(map1));  
[{"address":"玉溪","code":"1","num":1},{"address":"红塔区","code":"11","num":3},{"address":"玉溪","code":"11","num":4}]
{"红塔区":{"num大于等于3":[{"address":"红塔区","code":"11","num":3}]},"玉溪":{"num小于3":[{"address":"玉溪","code":"1","num":1}],"num大于等于3":[{"address":"玉溪","code":"11","num":4}]}}

分组后再聚合求总数

Map<String, Long> map5 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.counting()));
List<BBuildDept> listDept=new ArrayList();
    BBuildDept dept = new BBuildDept();
    dept.setAddress("玉溪");
    dept.setCode("1");
    dept.setNum(4);
    listDept.add(dept);
    
    BBuildDept dept1 = new BBuildDept();
    dept1.setAddress("红塔区");
    dept1.setCode("11");
    dept1.setNum(3);
    listDept.add(dept1);
    
    BBuildDept dept2 = new BBuildDept();
    dept2.setAddress("玉溪");
    dept2.setCode("11");
    dept2.setNum(4);
    listDept.add(dept2);
    
    Map<String , Long> map1= listDept.stream().collect(Collectors.groupingBy(BBuildDept::getAddress, Collectors.counting()));
    System.out.println(JSON.toJSONString(listDept));  
    System.out.println(JSON.toJSONString(map1));  
[{"address":"玉溪","code":"1","num":4},{"address":"红塔区","code":"11","num":3},{"address":"玉溪","code":"11","num":4}]
{"红塔区":1,"玉溪":2}

分组后再做相加运算

Map<String, Integer> map6 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.summingInt(Product::getNum)));

    List<BBuildDept> listDept=new ArrayList();
    BBuildDept dept = new BBuildDept();
    dept.setAddress("玉溪");
    dept.setCode("1");
    dept.setNum(4);
    listDept.add(dept);
    
    BBuildDept dept1 = new BBuildDept();
    dept1.setAddress("红塔区");
    dept1.setCode("11");
    dept1.setNum(3);
    listDept.add(dept1);
    
    BBuildDept dept2 = new BBuildDept();
    dept2.setAddress("玉溪");
    dept2.setCode("11");
    dept2.setNum(4);
    listDept.add(dept2);
    
    Map<String, Integer> map1= listDept.stream().collect(Collectors.groupingBy(BBuildDept::getAddress, Collectors.summingInt(BBuildDept::getNum)));
    System.out.println(JSON.toJSONString(listDept));  
    System.out.println(JSON.toJSONString(map1)); 
[{"address":"玉溪","code":"1","num":4},{"address":"红塔区","code":"11","num":3},{"address":"玉溪","code":"11","num":4}]
{"红塔区":3,"玉溪":8}

过滤加分组

Map<Integer, List> peopleByAge = peoples.stream().filter(p -> p.age > 12).collect(Collectors.groupingBy(p -> p.age, Collectors.toList()));
List<BBuildDept> listDept=new ArrayList();
    BBuildDept dept = new BBuildDept();
    dept.setAddress("玉溪");
    dept.setCode("1");
    dept.setNum(4);
    listDept.add(dept);
    
    BBuildDept dept1 = new BBuildDept();
    dept1.setAddress("红塔区");
    dept1.setCode("11");
    dept1.setNum(13);
    listDept.add(dept1);
    
    BBuildDept dept2 = new BBuildDept();
    dept2.setAddress("玉溪");
    dept2.setCode("11");
    dept2.setNum(4);
    listDept.add(dept2);
    
    Map<Object, List<BBuildDept>> map1= listDept.stream().filter(p -> p.getNum() > 3).collect(Collectors.groupingBy(p -> p.getAddress(), Collectors.toList()));
    System.out.println(JSON.toJSONString(listDept));  
    System.out.println(JSON.toJSONString(map1)); 
[{"address":"玉溪","code":"1","num":4},{"address":"红塔区","code":"11","num":13},{"address":"玉溪","code":"11","num":4}]
{"红塔区":[{"address":"红塔区","code":"11","num":13}],"玉溪":[{"address":"玉溪","code":"1","num":4},{"address":"玉溪","code":"11","num":4}]}

某个字段的和

 int more = pubList.stream().mapToInt(e -> Integer.parseInt(e.get("more").toString())).sum();
List<BBuildDept> listDept=new ArrayList();
    BBuildDept dept = new BBuildDept();
    dept.setAddress("玉溪");
    dept.setCode("1");
    dept.setNum(4);
    listDept.add(dept);
    
    BBuildDept dept1 = new BBuildDept();
    dept1.setAddress("红塔区");
    dept1.setCode("11");
    dept1.setNum(13);
    listDept.add(dept1);
    
    BBuildDept dept2 = new BBuildDept();
    dept2.setAddress("玉溪");
    dept2.setCode("11");
    dept2.setNum(4);
    listDept.add(dept2);
    
     int more = listDept.stream().mapToInt(e -> Integer.parseInt(e.getCode())).sum();
     System.out.println(JSON.toJSONString(listDept));  
    System.out.println(JSON.toJSONString(more));  
[{"address":"玉溪","code":"1","num":4},{"address":"红塔区","code":"11","num":13},{"address":"玉溪","code":"11","num":4}]
23

排序

list.stream().sorted(Comparator.comparing(a->address.indexOf(a))).forEach(System.out :: println);
list.stream().sorted((a,b)->address.IndexOf(a)-address.IndexOf(b)).forEach(System.out :: println);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值