java实现树形菜单,使用Hutool TreeUtil工具,简单配置即可

使用Hutool工具中的TreeUtil进行配置实现树形结构

maven pom

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.6</version>
</dependency>
 // 1.查数据
 List<Menu> all = new ArrayList<>();
 
 // 2.配置,可以不用配置,使用默认   TreeNodeConfig.DEFAULT_CONFIG
 TreeNodeConfig config = new TreeNodeConfig();
 //config.setIdKey("id");//默认为id可以不设置
 //config.setParentIdKey("parentId");//默认为parentId可以不设置
 //config.setDeep(4);//最大递归深度
 config.setWeightKey("priority");//排序字段
 
 // 3.转树,Tree<>里面泛型为id的类型
 List<Tree<Long>> build = TreeUtil.build(all, 0L, config, (object, tree) -> {
     // 也可以使用 tree.setId(object.getId());等一些默认值
     tree.setId(object.getId())
            .setParentId(object.getParentId())
            .setName(object.getName())
    		.putExtra("icon", object.getIcon())
          	.putExtra("url", object.getUrl())
    		.putExtra("priority", object.getPriority())
     		.putExtra("type", object.getType());
 });

为了字段名和配置的松耦合,引入如下工具类

字段名工具类

/**
 * 使Function获取序列化能力
 *
 */
@FunctionalInterface
public interface SerializableFunction<T, R> extends Function<T, R>, Serializable {
}



/**
 * 获取某个实体类的字段名称
 *
 */
public class ColumnUtil {

    public static <T> String getName(SerializableFunction<T, ?> fn) {
        // 从function取出序列化方法
        Method writeReplaceMethod;
        try {
            writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace");
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }

        // 从序列化方法取出序列化的lambda信息
        boolean isAccessible = writeReplaceMethod.isAccessible();
        writeReplaceMethod.setAccessible(true);
        SerializedLambda serializedLambda;
        try {
            serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn);
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }
        writeReplaceMethod.setAccessible(isAccessible);

        // 从lambda信息取出method、field、class等
        String fieldName = serializedLambda.getImplMethodName().substring("get".length());
        fieldName = fieldName.replaceFirst(fieldName.charAt(0) + "", (fieldName.charAt(0) + "").toLowerCase());

        return fieldName;
    }
}

// 用法
String masterName= ColumnUtils.getName(ScheMaster::getMasterName);//得到对应的字段名

实现案例

// 1.查数据
List<ScheMaster> list = iScheMasterService.list(lqw);
 
//转换为树结构
//配置
TreeNodeConfig config = new TreeNodeConfig();
config.setIdKey(ColumnUtils.getName(ScheMaster::getMasterId));//id
config.setParentIdKey(ColumnUtils.getName(ScheMaster::getParentId));//父级id
config.setChildrenKey(ColumnUtils.getName(ScheMaster::getChildren));//子节点

//转换
List<Tree<Integer>> build = TreeUtil.build(list, null, config, ((object, treeNode) -> {
    treeNode.setId(object.getMasterId().intValue());//id
    treeNode.setParentId(object.getParentId() != null?object.getParentId().intValue():null);//父id
    treeNode.putExtra(ColumnUtils.getName(ScheMaster::getMasterName), object.getMasterName());//任务名称
    treeNode.putExtra(ColumnUtils.getName(ScheMaster::getLevel), object.getLevel());//层级
    treeNode.putExtra(ColumnUtils.getName(ScheMaster::getPlanStartTime), DateUtil.formatDate(object.getPlanStartTime()));//计划开始时间
    treeNode.putExtra(ColumnUtils.getName(ScheMaster::getRealStartTime), DateUtil.formatDate(object.getRealStartTime()));//实际开始时间
    treeNode.putExtra(ColumnUtils.getName(ScheMaster::getPlanFinishTime), DateUtil.formatDate(object.getPlanFinishTime()));//计划完成时间
    treeNode.putExtra(ColumnUtils.getName(ScheMaster::getRealFinishTime), DateUtil.formatDate(object.getRealFinishTime()));//实际完成时间
    treeNode.putExtra(ColumnUtils.getName(ScheMaster::getPlanDays), object.getPlanDays());//计划工期
    treeNode.putExtra(ColumnUtils.getName(ScheMaster::getPercentageComplete), object.getPercentageComplete());//百分比
    
}));
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值