代码如下:
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()); }
执行结果: