最近有个场景就是,要对一批数据进行修改, 然后有一些key组成条件后是一对一的,要先从数据库中查出一个项目的全部数据,再根据那些条件 一一比较,我觉得不是很好,就给优化了一下.
原代码
public static void main(String[] args) {
User result;
//从前端获取一批数据 reqList 手动填充模拟一下
List<User> reqList = new ArrayList();
reqList.add(new User().setName("王小明").setAge(13).setAddress("校门口12号楼102室"));
reqList.add(new User().setName("王小明").setAge(14).setAddress("校门口12号楼103室"));
reqList.add(new User().setName("猪小明").setAge(15).setAddress("校门口12号楼104室"));
//就是先数据库 查出来一批数据 poList
for(User req: reqList ){
List<User> poList=userDao.list();
for(User po : poList){
if(po.getName().equals(req.getName())&&
po.getAge().equals(req.getAge())&&
po.getAddress().equals(req.getAddress())
){
result = po;
//匹配中的干点什么 这样每次匹配都得两个大循环
sout(result);
}
}
}
//然后遍历reqList 一个个拿key 再去跟poList里面遍历比较 且是一个一个key的比较
}
优化后
public final static String USER_KEY_LENGTH = 3;
//先写个拼接这些key的方法
public static String joinUserKey(User user){
return joinKey(USER_KEY_LENGTH ,user.getName(),user.getAge(),user.getAddress());
}
//整理了一个可复用的方法 可以放到工具类里,而且有一些情况是 还要另外处理入参 不会原原本本的调用上面那样一个User类
public static String joinKey(Integer argsLength,String... args){
Assert.isTrue(argsLength==args.length,"参数长度与期望值不匹配");
StringJoiner stringJoiner = new StringJoiner(",");
for (String arg : args) {
stringJoiner.add(arg);
}
return stringJoiner.toString();
}
public static void main(String[] args) {
List<User> reqList = new ArrayList();
reqList.add(new User().setName("王小明").setAge(13).setAddress("校门口12号楼102室"));
reqList.add(new User().setName("王小明").setAge(14).setAddress("校门口12号楼103室"));
reqList.add(new User().setName("猪小明").setAge(15).setAddress("校门口12号楼104室"));
//将这些一条条的属性拼接成一个大key, 然后value是对象
List<User> poList=userDao.list();
Map<String, User > userMap = poList.stream()
.collect(Collectors.toMap(this::joinUserKey, user-> user));
for(User req: reqList ){
//比较的时候 直接把req的各个key拼接成大key来取即可
User user= userMap.get(this.joinKey(req);
//然后判断这个是否为空即可,主要是这里需要用到这个对象,
if(user != null ){
sout(user)
}
否则直接判断是否有这个key即可
userMap .containsKey(this.joinKey(req));
}
}