场景:页面需要实现一个部门树,父部门下可以添加子部门,每个部门在创建时需输入一个序号值,要求同一级别的部门可以按照序号进行增序或者降序进行排序。
部门对象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属性的顺序排序。