超好用的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()
))));
有空待续
… 待续