我认为这是我最大的错误,我开始意识到我在我的网络应用程序中重复了很多次。
每次我想比较 List 中的一个属性是否与 List 的另一个属性相同时,我都会创建一个双 for 循环。
当然,目前这对我的网站来说还不错,但是一旦拥有数百万用户,它就会开始变慢。
这是我的典型错误:
在这种情况下,我有一个 List<String>
使用登录用户的用户名,我想向前端返回每个用户的完整用户信息。
这看起来很糟糕,因为我需要遍历所有用户,即使我只需要获取在线用户的信息。
谁能帮我解决这个问题?这是不好的做法吗?我能做什么?
@Autowired
private ActiveUsers activeUsers;
@RequestMapping(value = "/loggedUsers", method = RequestMethod.GET)
public @ResponseBody List<User> getLoggedUsers() {
List<User> users = User.getUsers();
List<User> onlineUsers = new ArrayList<>();
for(User user : users) {
for(String username : activeUsers.getUsers()) {
if(username.equals(user.getUsername())) {
onlineUsers.add(user);
}
}
}
return onlineUsers;
}
最佳答案
使用 Map<String,User>
.有User.getUsers()
返回 Map
(它可能应该被缓存,这样您就不必在每次调用该方法时都生成那个 Map
)。键是用户名,值是对应的User
。 .
现在,嵌套循环可以替换为单个循环:
List<User> getLoggedUsers() {
Map<String,User> users = User.getUsers();
List<User> onlineUsers = new ArrayList<>();
for (String username : activeUsers.getUsers()) {
User user = users.get(username);
if(user != null) {
onlineUsers.add(user);
}
}
return onlineUsers;
}
在 Java 8 中,这可以简化为:
List<User> getLoggedUsers() {
Map<String,User> users = User.getUsers();
return activeUsers.getUsers()
.stream()
.map(users::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
关于java - 我作为程序员最大的错误——For Loops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49877339/