十次

由今天在网上提问想到的

2022-06-05 · 2 min read

今天在写代码时遇到了一个代码上的优化问题,大概的代码是这样的😀

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上发出了下面一个帖子

Snipaste_2021-06-15_15-18-33.png

我询问的是如何优化循环里面的这个userList。

于是得到了各种各样的回答,都是围绕优化userList中查找“张三”进行的。

得到的结果虽然很好,但是对于解决我的需求其实还是不行。

于是我把我详细的代码发了出来,最后才得到了相对完美的答案。

里面有人提出了我的提问是有问题的,典型的【XY problem】。

有的时候我们被x问题困扰,觉得y方法可以解决这个问题,但是不知道y方法怎么使用,就问别人。

别人搞了半天。

别人问:你到底想干什么?
回答:其实我想解决x问题
别人曰:你妹,这个还不简单。

因为我提问的方式不正确,导致大家在错误的方向浪费时间。

其实我想解决的是这个双重循环慢的问题,但我只咨询了内部的这个循环,导致大家一直将目光聚焦在这个循环上面,没有考虑外层的循环,其实将userList转成Map就好了,以后的每次循环都是根据Hash进行查询map的值,极大的减少了耗时。

提问的艺术~~博大精深。

当然收获还有这个将list转为map的思想,以前我都是双重for循环,上来就是干的。。。。。。