赞
踩
当需要将一个包含对象的list集合中的对象中的某一个属性通过某种条件抽取成为一个新的list的时候可以这么做:
例如对象:
[{name:张三,hight:187cm,tizhong:69KG,dt:20190817,tp:10min,stepIndex:0},
{name:张三,hight:187cm,tizhong:69KG,dt:20190817,tp:10min,stepIndex:1}
...
]
我们有一个包含这个对象的list集合,记录了张三每天每个时间片的身高体重的变化(可怕的统计),那么假设我们现在有个需求是将张三在每个时间片的身高体重变化分别提取出来,并且要取出每天相同时间片的平均值,那么我们怎么办?
首先我们的list里有很多天的数据,所以我们可以整理下思路:
List<User> userList = new arrayList<>(); userList.add(xxxxxxx); //假设有很多条记录了 Map<Integer,User> userMap = new HashMap<>(); userList.stream().forEach( user -> { if(userMap. containsKey(user.getStepIndex())){ User user = new User(“”,0,0,””,””,0) userMap.set(user.getStepIndex(), user) } userMap.get(user.getStepIndex()).setStepIndex(userMap.get(user.getStepIndex()).getStepIndex()+1) User user01 = getSum(user,userMap.get(user.getStepIndex())); userMap.put(user.getStepIndex(), user01) }) Public User getSum(User u1, User u2){ u2.setHight(u1.getHight() + u2.getHight()); u2.setTizhong(u1.getTizhong() + u2.getTizhong); return u2; }
/到这里我们将时间片序号作为map的key,只要没有这个时间片序号的键,我们就new一个默认初始化的user放进map。然后我们将value里的user的stepIndex属性作为累加次数来计数(因为我们不需要关注对象里的stepIndex了,并且stepIndex是数字类型符合我们的技术要求)接着就可以将当前list里的数累加到我们new出来的user里了。
List<Line> hightList = userMap.entrySet().stream().map(user -> {
return new Line(user.getStepIndex(), user.getHight()/user.getStepIndex());
}).sorted(Comparator.comparing(Line::getX)).collect(Collectors.toList());
List<Line> TizhongList = userMap.entrySet().stream().map(user -> {
return new Line (user.getStepIndex(), user.getTizhong()/user.getStepIndex());
}).sorted(Comparator.comparing(Line::getX)).collect(Collectors.toList());
public class Line{
private Integer x;
private String y;
}
到这里我们用entrySet()方法将map转换成list然后用stream流式调用 将需要的list数据转换出来了,需要注意的是 因为我们用的是map的方式转换,所以当我们转成list后,原来userlist里的数据会乱掉,所以我们需要再根据step_index来进行一下排序。
如果有更优雅的实现方法希望大家可以留言,共同学习~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。