package com.fly.se.list;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 列表分组
*
* @author fly
* @since 2023/4/21
*/
public class ListGroup {
public static void main(String[] args) {
List<Employee> employeeList = new ArrayList<>();
employeeList.add(new Employee(1, "鸣人", 1, 17, 5000, new BigDecimal("62.35")));
employeeList.add(new Employee(2, "佐助", 1, 17, 6000, new BigDecimal("62.35")));
employeeList.add(new Employee(3, "小樱", 2, 17, 7000, new BigDecimal("52.35")));
employeeList.add(new Employee(4, "小李", 1, 17, 8000, new BigDecimal("62.35")));
employeeList.add(new Employee(5, "天天", 2, 17, 9000, new BigDecimal("52.35")));
employeeList.add(new Employee(6, "路飞", 1, 18, 10000, new BigDecimal("62.35")));
employeeList.add(new Employee(7, "索隆", 1, 18, 11000, new BigDecimal("62.35")));
// 根据 年龄 分组
Map<Object, List<Employee>> ageMap = employeeList.stream().collect(Collectors.groupingBy(Employee::getAge));
//
ageMap.forEach((age, list) -> {
});
// 先根据 性别 分组,再根据 年龄 分组
Map<Integer, Map<Integer, List<Employee>>> sexAgeMap = employeeList.stream().collect(Collectors.groupingBy(Employee::getSex, Collectors.groupingBy(Employee::getAge)));
sexAgeMap.forEach((sex, ageTmpMap) -> ageTmpMap.forEach((age, list) -> {
}));
// 先根据 性别 分组,再根据 姓名 分组,并将姓名放入Set
Map<Integer, Set<String>> sexNameMap = employeeList.stream().collect(Collectors.groupingBy(Employee::getSex, Collectors.mapping(Employee::getName, Collectors.toSet())));
sexNameMap.forEach((sex, nameTmpMap) -> nameTmpMap.forEach((name) -> {
}));
// 根据 传入参数 进行分组
Map<String, List<Employee>> sexMap = employeeList.stream().collect(Collectors.groupingBy(e -> groupKey(e, "sex")));
sexMap.forEach((sex, list) -> {
});
// 分组后,根据指定字段排序
Map<Integer, List<Employee>> sexMap2 = employeeList.stream()
.sorted(Comparator.comparing(Employee::getId,Comparator.nullsLast(Integer::compareTo)))
.collect(Collectors.groupingBy(Employee::getSex, Collectors.toList()));
sexMap2.forEach((sex, list) -> {
});
}
@ApiOperation("list分组传参使用")
private static <T> String groupKey(@ApiParam("实体类") T clazz,@ApiParam("字段名") String columnName) {
try {
// 获取指定字段的方法名
String methodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
// 获取指定字段的值
Object value = clazz.getClass().getMethod(methodName).invoke(clazz);
if (null != value) {
return value.toString();
}
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
return "";
}
@Data
@AllArgsConstructor
static class Employee{
@ApiModelProperty("主键id")
private Integer id;
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty("性别 1:男 2:女 3:未知")
private Integer sex;
@ApiModelProperty("年龄")
private Integer age;
@ApiModelProperty("薪资")
private Integer salary;
@ApiModelProperty("体重")
private BigDecimal weight;
}
}
1、List分组
于 2019-04-15 17:32:51 首次发布