最近在做一个手机App里的设置中心,之前旧代码设置中心数据结构是多个List集合然后嵌套一层子集,现在要重新设计,商量后觉得嵌套的结构比较合适产品的PRD,有点类似于之前利用Mybatis实现评论嵌套功能,相比之下写法更加简单
1、首先我们把所有的设置项都放在一张表进行存储,子设置项通过parent_id和父设置项进行关联,这样的结构允许设置项可以嵌套多层,如果以后产品需要加三级设置页,也是能够兼容滴!
大概思路,通过SELECT All 拿到所有设置项,然后根据parentId进行分组
List<Setting> allSetting = userSettingService.selectAllSetting();
Map<String,List<Setting>> settingMap = allsetting.stream().collect(Collectors.groupBy(Setting::getParentId);`
返回的结构就是这种嵌套结构
重点来了,构造多级树结构
String parentId = "-1";
//从parentId = "-1" 开始
private void buildTree(String parentId,Setting setting, Map<String,List<Setting>> settingMap) {
List<Setting> mainSettings = settingMap.get(parentId);
mainSettings.forEach(mainSetting -> {
rescure(mainSetting, settingMap, list -> setting.setSubSettings(list))
});
}
private <T> void rescure(Setting setting, Map<String,List<Setting>> settingMap,Consumer<T> consumer) {
if (CollectionUtils.isNotEmpty(settingMap.get(setting.getGuid()))) {
List<Setting> subSettings = settingMap.get(setting.getGuid()
consumer.accept(subSettings))
buildTree(setting.getGuid, setting, settingMap);
}
}
这样的好处是 代码里设置项可以进行二次处理,例如对某些特殊的设置项在遍历树过程中进行一下处理
这样的写法是最基础的,其实就是递归的思想,用Consumer做了处理,后面还能继续做封装处理,这里就不展开了,推荐一个公众号的链接里面有关于Comsumer和Supplier的简单代码应用 用Java8改造后的模板方法模式真的是yyds!