开发中,我常遇到这样的情况,就是一个list集合里面装了10个对象,好多条数据某个字段(A字段)的值是想同的,通过这个字段去确定另外一个值(B字段),就会拿着这个A字段去查询别的表,然后再给B字段赋值,但这有个问题,就是遍历10次去查询,那么数据库的IO交互就很多次。
对于这个解决这个问题,我是这样处理的:
1、先将对象获取到A字段的值,进行去重(得到一个list)
1 List<String> collect = list.stream().map(WorkstationGroup::getGroupId).collect(Collectors.toList());
2、将去重后的list去数据库查询,假设得到3条数据,这样就由原先的10次数据交互就变为1次,然后将这个3条数据通过stream流变为一个map对象。
1 Map<String, String> map = list.stream().collect(Collectors.toMap(WorkstationGroup::getGroupId, WorkstationGroup::getGroupName));
3、将list遍历,将list的A字段和map里面的key比较,相同的话,就把map的value赋值给B字段。
demo代码如下:
1 List<WorkstationGroup> list = new ArrayList<>(); 2 WorkstationGroup workstationGroup1 = new WorkstationGroup(); 3 workstationGroup1.setGroupId("aaa"); 4 WorkstationGroup workstationGroup2 = new WorkstationGroup(); 5 workstationGroup2.setGroupId("aaa"); 6 WorkstationGroup workstationGroup3 = new WorkstationGroup(); 7 workstationGroup3.setGroupId("aaa"); 8 WorkstationGroup workstationGroup4 = new WorkstationGroup(); 9 workstationGroup4.setGroupId("bbb"); 10 WorkstationGroup workstationGroup5 = new WorkstationGroup(); 11 workstationGroup5.setGroupId("bbb"); 12 list.add(workstationGroup1); 13 list.add(workstationGroup2); 14 list.add(workstationGroup3); 15 list.add(workstationGroup4); 16 list.add(workstationGroup5); 17 Map<String,String> map = new HashMap<>(); 18 map.put("aaa","张三"); 19 map.put("bbb","李四"); 20 List<WorkstationGroup> collect = list.stream().map(e -> { 21 for (String s : map.keySet()) { 22 if (e.getGroupId().equals(s)){ 23 e.setGroupName(map.get(s)); 24 } 25 } 26 return e; 27 }).collect(Collectors.toList()); 28 System.out.println("collect = " + collect);
关于查询数据库就没写了,我就直接写了一个结果list,map,主要就是比较的那部分。不知道有没有更优的解决办法,欢迎留言
标签:map,WorkstationGroup,list,collect,字段,key,new From: https://www.cnblogs.com/qwg-/p/17987481