java 8 list collectors to map 保持顺序的两种方案

Java 8 list 转 map 保持顺序

思路直接转换为LinkedHashMap。

 User user = new User();
        user.setAccountId("1");
        List<User> users = Lists.newArrayList();
        User user2 = new User();
        user2.setAccountId("2");
        User user3 = new User();
        user3.setAccountId("3");
        User user4 = new User();
        user4.setAccountId("4");
        users.add(user);
        users.add(user3);
        users.add(user2);
        users.add(user4);

常用的两个参数方法

 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);
    }
    
Map<String, User> userMap2 = users.stream().collect(Collectors.toMap(a -> a.getAccountId(), a -> a));
        log.info("转回map:{}", JSON.toJSONString(userMap2));
        //转回map:{"1":{"account_id":"1","query":{}},"2":{"account_id":"2","query":{}},"3":{"account_id":"3","query":{}},"4":{"account_id":"4","query":{}}}

这个函数是转map,无法保证数据的顺序。而保留数据的顺序实际上就转为LinkedHashMap
四个参数方法

  public static <T, K, U, M extends Map<K, U>>
    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction,
                                Supplier<M> mapSupplier) {
        BiConsumer<M, T> accumulator
                = (map, element) -> map.merge(keyMapper.apply(element),
                                              valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
    }

代码实例

  LinkedHashMap<String, User> userMap = users.stream().collect(Collectors.toMap(a -> a.getAccountId(), a -> a,(u, v) -> {
            throw new IllegalStateException(String.format("Duplicate key %s", u));
        }, LinkedHashMap::new));
        // 转回map:{"1":{"account_id":"1","query":{}},"3":{"account_id":"3","query":{}},"2":{"account_id":"2","query":{}},"4":{"account_id":"4","query":{}}}
    //    保持与list一直的格式

另一种方案

        LinkedHashMap<String, User> userMap1 = users.stream().collect(LinkedHashMap::new,(map, item) -> map.put(item.getAccountId(), item),Map::putAll);
       

  • 1
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

极客架构

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值