【开发技巧】超好用的stream流处理

stream流式处理小技巧

对象数组 List<T> 转 Map<key, U>

某些时候我们查询到的数组数据,这个数组又需要反复的去根据某个字段查询定位该对象,就可以将这个字段提出来作为key(当然,这里的key需要唯一)然后通过map去快速获取这个对象

Map<String, UserVo> collect = list.stream()
        .collect(Collectors.toMap(user -> {
            return user.getUserId() + "_对user的字段做自定义操作返回作为key";
        }, user -> {
            UserVo userVo = new UserVo();
            userVo.setUserId(user.getUserId());
            userVo.setUserName(user.getUserName());
            return userVo;
        }));

tips:如果不需要转换 类型,就直接用Function.identity()代替原对象就可以了,这个在各种操作里都适用

// 对象数组转Map,这里key是User的唯一id(user_id)
Map<String, User> collect = list.stream()
               .collect(Collectors.toMap(User::getUserId, > Function.identity()));

对象数组 List<T> 转 Map<key, List<U>>

当我们的key不唯一的时候,就需要通过list去存储相同key的对象了,比如我们需要将我们的用户按男女组分组,那就可以把性别当key,然后对应用户作为数组元素去映射起来

Map<String, List<UserVo>> collect2 = list.stream()
   .collect(
      Collectors.groupingBy(
         User::getSex,    // key
         Collectors.mapping(user -> {
             UserVo userVo = new UserVo();
             userVo.setUserId(user.getUserId());
             userVo.setUserName(user.getUserName());
             return userVo;
         }, Collectors.toList())));

对象数组 List<T> 转 Map<key, Map<key, List<U>>>

当我们要对一组数据按多个维度分组的时候。
比如我们的这组用户数据:

  • 根据性别划分
  • 然后同性别的人,根据父id划分(比如根据用户的管理人划分)

这样得到的数据,如果要查男性的xx下属有谁,就可以直接get(“男”).get(“xx”)获取到对应集合了,总而言之,数据分好组了怎么操作都简单了

Map<String, Map<String, List<UserVo>>> collect3 = list.stream().collect(
   Collectors.groupingBy(User::getSex,
      Collectors.mapping(Function.identity(),
         Collectors.groupingBy(User::getParentId, Collectors.mapping(
             user -> {
                 UserVo userVo = new UserVo();
                 userVo.setUserId(user.getUserId());
                 userVo.setUserName(user.getUserName());
                 return userVo;
             }, Collectors.toList()
         ))));

有空待续

… 待续

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值