private List<ResourceInfo> getTreeModelList(final List<ResourceVO> metaList) {
        final List<ResourceInfo> retList = new ArrayList<>();
        if (CollectionUtils.isEmpty(metaList)) {
            return retList;
        }
        final Map<String, ResourceInfo> resourceInfoMap = metaList.stream()
                .map(ResourceInfo::buildResourceInfo)
                .filter(resourceInfo -> Objects.nonNull(resourceInfo) && StringUtils.isNotEmpty(resourceInfo.getId()))
                .collect(Collectors.toMap(ResourceInfo::getId, Function.identity(), (value1, value2) -> value1));
        final Map<String, Set<String>> metaChildrenMap = metaList.stream()
                .filter(meta -> Objects.nonNull(meta) && StringUtils.isNotEmpty(meta.getId()))
                .collect(Collectors.toMap(ResourceVO::getParentId, resourceVO -> new LinkedHashSet<>(Collections.singletonList(resourceVO.getId())), ListUtil::mergeSet, LinkedHashMap::new));
        metaChildrenMap.forEach((parent, children) -> {
            if (CollectionUtils.isNotEmpty(children)) {
                ResourceInfo resourceInfo = resourceInfoMap.get(parent);
                List<ResourceInfo> targetList = Objects.isNull(resourceInfo) ? retList : resourceInfo.getChildren();
                children.stream().map(resourceInfoMap::get).filter(Objects::nonNull).forEach(targetList::add);
            }
        });
        return retList;
    }
get menu list.

@param metaList {@linkplain ResourceDTO}
@return list of {@linkplain ResourceInfo}
shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RoleServiceImpl.java