今天在写代码时遇到了一个代码上的优化问题,大概的代码是这样的😀
List<String> userIds = customerList.stream().map(Customer::getUserId).collect(Collectors.toList());
List<User> userList = userService.getByIds(userIds);
customerList.forEach(c->{
//这里需要循环很多次(10W+)
Optional<User> first = userList.stream().filter(e->e.getName().equals(c.getName)).findFirst();
if (first.isPresent()){
User user = first.get();
//别的操作
}
})
考虑到第7行代码每一个循环都要遍历一次,而这个userList
的size可能有10万+的大小,每次循环都是极其耗时的操作。
于是我在v2ex上发出了下面一个帖子
我询问的是如何优化循环里面的这个userList。
于是得到了各种各样的回答,都是围绕优化userList中查找“张三”进行的。
得到的结果虽然很好,但是对于解决我的需求其实还是不行。
于是我把我详细的代码发了出来,最后才得到了相对完美的答案。
里面有人提出了我的提问是有问题的,典型的【XY problem】。
有的时候我们被x问题困扰,觉得y方法可以解决这个问题,但是不知道y方法怎么使用,就问别人。
别人搞了半天。
别人问:你到底想干什么?
回答:其实我想解决x问题
别人曰:你妹,这个还不简单。
因为我提问的方式不正确,导致大家在错误的方向浪费时间。
其实我想解决的是这个双重循环慢的问题,但我只咨询了内部的这个循环,导致大家一直将目光聚焦在这个循环上面,没有考虑外层的循环,其实将userList转成Map就好了,以后的每次循环都是根据Hash进行查询map的值,极大的减少了耗时。
提问的艺术~~博大精深。
当然收获还有这个将list转为map的思想,以前我都是双重for循环,上来就是干的。。。。。。