java8 集合先分组,再排序

场景:页面需要实现一个部门树,父部门下可以添加子部门,每个部门在创建时需输入一个序号值,要求同一级别的部门可以按照序号进行增序或者降序进行排序。

部门对象SysDept:

public class SysDept extends BaseEntity<SysDept> {
	private static final long serialVersionUID = 1L;
	/**
	 * 部门名称
	 */
	@NotBlank(message = "部门名称不能为空")
	@ApiModelProperty(value = "部门名称")
	private String name;
	/**
	 * 排序
	 */
	@NotNull(message = "排序值不能为空")
	@ApiModelProperty(value = "排序值")
	private Integer sort;

	/**
	 * 父级部门id
	 */
	@NotNull(message = "上级部门ID不能为空")
	@ApiModelProperty(value = "上级部门id")
	private String pid;
	
	/**
	 * 上级部门名称,非数据库字段
	 */
	@TableField(exist = false)
	private String parName;

}

业务代码实现:

    @GetMapping
	@ApiOperation(value = "分页查询部门列表")
	public R<List<SysDept>> search(@ModelAttribute Page<SysDept> page, SysDept sysDept){
		LambdaQueryWrapper<SysDept> wrapper = Wrappers.lambdaQuery();
        //可以根据部门名称进行查询
		if (StrUtil.isNotBlank(sysDept.getName())){
			wrapper.like(SysDept::getName,sysDept.getName());
		}
		List<SysDept> list = this.sysDeptService.list(wrapper);
		List<SysDept> result;
        //根据pid进行分组,即同一级别的分到一组,形成一个map
		Map<String ,List<SysDept>> map = list.stream().collect(Collectors.groupingBy(SysDept::getPid));
		//判断增序还是降序
		if (page.orders().size() > 0) {
			if ("sort".equals(page.orders().get(0).getColumn()) && page.orders().get(0).isAsc()) {
               //通过sort属性进行排序
				result = map.values().stream()
						.flatMap(List::stream)
						.sorted(Comparator.comparing(SysDept::getSort))
						.collect(Collectors.toList());
			} else {
				result = map.values().stream()
						.flatMap(List::stream)
						.sorted(Comparator.comparing(SysDept::getSort).reversed())
						.collect(Collectors.toList());
			}
		} else {
			//page为空时默认降序
			result = map.values().stream()
					.flatMap(List::stream)
					.sorted(Comparator.comparing(SysDept::getSort).reversed())
					.collect(Collectors.toList());
		}

		return R.ok(result);
	}

代码中,首先通过groupingBy()方法进行分组,再使用Map对象的values()方法获取所有的值,返回一个Collection对象。然后使用Stream API中的flatMap()方法将每个nmap的值(List<SysDept>对象)都映射到一个流中。flatMap()方法接受一个Function函数作为参数,该函数用于将List<SysDept>对象转换成一个Stream对象。

接着,使用sorted()方法按照SysDept对象的sort属性进行排序,并最终使用collect()方法将所有对象合并到一个List<SysDept>集合中。

这样,我们就可以得到一个包含所有SysDept对象的集合,且其中的每个SysDept对象都按照其sort属性的顺序排序。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值