public class Group extends HuaPingBaseEntity {
/**
* 组 ID
*/
private String groupId;
/**
* 组名称
*/
private String groupName;
/**
* 域名
*/
private String domain;
/**
* 父节点 ID
*/
private String parentId;
/**
* 层级
*/
private int levelId;
/**
* 排序
*/
private int orderId;
/**
* 子节点数量
*/
private int childCount;
private List<? extends HuaPingBaseEntity> child;
private Integer open=0;
private Integer checked=0;
private int level;
private Integer onlineNum;
private Integer outlineNum;
private List<Dev> devChildren;
@Override
public List<? extends HuaPingBaseEntity> getSubList() {
return child;
}
@Override
public void setSubList(List<? extends HuaPingBaseEntity> subList) {
this.setChild(subList);
}
private Integer devNum;
public Integer getDevNum() {
if(child!=null&&child.size()>0){
HuaPingBaseEntity huaPingBaseEntity = child.get(0);
if(huaPingBaseEntity instanceof Dev){
return child.size();
}else if(huaPingBaseEntity instanceof Group){
List<Group> groupList=(List<Group>)child;
return groupList.stream().mapToInt(temp->temp.getDevNum()).sum();
}
}
return 0;
}
public List<Dev> getDevChildren() {
if(child!=null&&child.size()>0){
HuaPingBaseEntity huaPingBaseEntity = child.get(0);
if(huaPingBaseEntity instanceof Dev){
return (List<Dev>)child;
}else if(huaPingBaseEntity instanceof Group){
List<Group> groupList=(List<Group>)child;
List<Dev> devList = groupList.stream().map(temp -> temp.getDevChildren()).reduce((acc, item) -> {
acc.addAll(item);
return acc;
}).get();
return devList;
}
}
return new ArrayList<>();
}
}
线上需要有统计接口,本来是灵光乍现的自己使用内部类解决,发现统计数据不对。还会自增。
起初是为了解决List<List<Dev>>的合并,手贱的使用了累加器
.reduce((acc, item) -> {
acc.addAll(item);
return acc;
}).get();
结果成了噩梦的开始,线上的数据会不停的增大。莫名其妙的原因,导致自己很是郁闷,修改了整2天的统计
下班了,以为是类内部处理混乱导致,开始把统计写成单独的统计计算类
public static void main(String[] args) {
Group root =new Group();
root.setGroupName("root");
List<Group> listl1=new ArrayList<>();
root.setChild(listl1);
for(int i=0;i<5;i++){
Group subGroup=new Group();
subGroup.setGroupName("sub"+i);
List<Dev> devList=new ArrayList<>();
subGroup.setChild(devList);
for(int j=i;j<5;j++){
Dev dev=new Dev();
dev.setStatus(j%3==0?1:0);
dev.setDevName("dev"+i+"_"+j);
devList.add(dev);
}
listl1.add(subGroup);
}
System.out.println(JSON.toJSONString(getDevChildren(root)));
System.out.println(getInfo(root));
}
验证时,发现第二次执行getDevChildren(root)方法时,数据莫名其妙的多出了10条,开始debug跟踪,最终发现第一条的子list中竟然有15条数据。
肯定是累加器出了问题,果断放弃lamdba的累加器,修改代码
public static List<Dev> getDevChildren(final Group group) {
List<? extends HuaPingBaseEntity> child = group.getChild();
if(child!=null&&child.size()>0){
HuaPingBaseEntity huaPingBaseEntity = child.get(0);
if(huaPingBaseEntity instanceof Dev){
return (List<Dev>)child;
}else if(huaPingBaseEntity instanceof Group){
ArrayList<Dev> devList=new ArrayList<>();
List<Group> groupList=(List<Group>)child;
List<List<Dev>> collect = groupList.stream().map(temp -> getDevChildren(temp)).collect(Collectors.toList());
collect.forEach(temp->{
devList.addAll(temp);
});
return devList;
}
}
return new ArrayList<>();
}
跑完数据,发现已经正常。
小case,大问题。 差点因为小问题,打碎了自己的自尊和自信。加油。