Java列表如何分组,可以使用stream()的Collectors.groupingBy()

前言

数据库经常使用的逻辑,放在Java代码如何实现,现在有个快捷的方法就是使用Java8的流进行分组

准备

需求:要把每个城市、每个公司的学生数量做分组统计数量
User.java

package com.wenwen.blog.service.learn.stream;

import lombok.Data;

/**
 * @author WangWenLei
 * @DATE: 2021/3/1
 **/
@Data
public class Student {
    
    
    private String name;
    private String city;
    private String company;

    public Student(String name, String city, String company) {
    
    
        this.name = name;
        this.city = city;
        this.company = company;
    }
}

Data.java

package com.wenwen.blog.service.learn.stream;

import lombok.Data;

/**
 * @author WangWenLei
 * @DATE: 2021/3/1
 **/
@Data
public class DataInfo {
    
    
    private String city;
    private String company;
    private int count;
    
    @Override
    public String toString() {
    
    
        return "DataInfo{" +
                "city='" + city + '\'' +
                ", company='" + company + '\'' +
                ", count=" + count +
                '}' + "\n";
    }
}

使用

package com.wenwen.blog.service.learn.stream;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author WangWenLei
 * @DATE: 2021/3/1
 **/
public class GroupBy {
    
    
    public static void main(String[] args) {
    
    
        List<Student> list = new ArrayList<>();
        Student s1 = new Student("wwl","北京","公司1");
        Student s2 = new Student("wwl2","北京","公司2");
        Student s3 = new Student("wwl3","深圳","公司1");
        Student s4 = new Student("wwl4","深圳","公司3");
        Student s5 = new Student("wwl5","北京","公司1");
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        list.add(s5);
        // 先按城市排序,再按公司排序
        Map<String, Long> collect = list.stream()
                // 中间用“_”隔开
                .collect(Collectors.groupingBy(o -> o.getCity() + "_" + o.getCompany(), Collectors.counting()));

        // 取数据
        List<DataInfo> countRecords = collect.keySet().stream().map(key -> {
    
    
            String[] temp = key.split("_");
            String cityName = temp[0];
            String company = temp[1];

            DataInfo record = new DataInfo();
            // 分组条件1
            record.setCity(cityName);
            // 分组条件2
            record.setCompany(company);
            // 统计的数量
            record.setCount(collect.get(key).intValue());
            return record;
        }).collect(Collectors.toList());
        System.out.println(collect);
        System.out.println(countRecords);
    }
}

运行结果:
在这里插入图片描述
这样就进行分组啦~

躬身自省,淳朴而谦逊否——文文的博客

猜你喜欢

转载自blog.csdn.net/weixin_42119415/article/details/114261796