1、List分组

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值