代码如下:

 

    public static <T,K> List<T> listToTree(List<T> list,Predicate<T> isTop,Function<? super T, ? extends K> getId , Function<? super T, ? extends K> getParentId, BiConsumer<T,List<T>> setChilds) {
        // 要点
        // 通过Collectors.groupingBy(Address::getPid)方法对addresses按照Pid进行分组,也就是将pid相同的放在一起
        Map<? extends K, List<T>> parentMap = list.stream().collect(Collectors.groupingBy(getParentId));
        list.forEach(item -> {
            //设置子节点
            setChilds.accept(item,parentMap.get(getId.apply(item)));
        });
        // 过滤出根节点集合,根节点已经包含了孩子节点
        return list.stream().filter(isTop).collect(Collectors.toList());
    }

 

 

 

 

执行结果:

 

posted on 2024-05-15 16:28  花开浪漫拾  阅读(90)  评论(0编辑  收藏  举报