代碼如下:
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 -> { //設(shè)置子節(jié)點 setChilds.accept(item,parentMap.get(getId.apply(item))); }); // 過濾出根節(jié)點集合,根節(jié)點已經(jīng)包含了孩子節(jié)點 return list.stream().filter(isTop).collect(Collectors.toList()); }
執(zhí)行結(jié)果:

浙公網(wǎng)安備 33010602011771號