Stream list使用toMap转树形结构并保留插入顺序

Stream list使用toMap转树形结构并保留插入顺序

//根节点为0
public static List<InterfaceParamEntity> toTreeParams(List<InterfaceParamEntity> params) {
    long rootId = InterfaceParamRootPid;
    Map<Long, InterfaceParamEntity> map = params.stream().collect(toMap(InterfaceParamEntity::getId, k -> k));
    if(map.values().stream().filter(node -> node.getIpaPid().equals(rootId))
            .allMatch(node -> CollectionUtils.isEmpty(node.getChildren()))) {
        map.values().stream()
            .filter(node -> !(node.getIpaPid().equals(rootId)))
            .forEach(node -> {
                InterfaceParamEntity parentNode = map.get(node.getIpaPid());
                if(parentNode != null){
                    if(parentNode.getChildren() == null)
                        parentNode.setChildren(new ArrayList<>());

                    parentNode.getChildren().add(node);
                }
            });
    }

    return map.values().stream()
            .filter(node -> node.getIpaPid().equals(rootId))
            .collect(toList());
}

核心代码 Stream Collectors.toMap
根据源码重写toMap方法 将HashMap 替换成LinkedHashMap既可

public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper) {
    return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
private static <T> BinaryOperator<T> throwingMerger() {
    return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}

stream.toMap 转换成有顺序的LinkedHashMap

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                                        Function<? super T, ? extends U> valueMapper) {
    return Collectors.toMap(keyMapper, valueMapper,
            (u,v) -> { throw new AppException(String.format("Duplicate key %s", u)); }, LinkedHashMap::new);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值