java - 我作为程序员最大的错误——For Loops

标签 java

我认为这是我最大的错误,我开始意识到我在我的网络应用程序中重复了很多次。

每次我想比较 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/

相关文章:

java - Spring Hibernate JSF 集成状态 404

java - 如何将列表从java传递到oracle表并一次获取所有值

java - 如何将父表和子表数据移动到存档表(具有相同的列)

java.lang.NumberFormatException : Invalid int: in display the image from sd card

java - 在存储桶和远程服务器之间使用 AWS lambda(java) 进行 Rsync

java - @Resource UserTransaction 和 EntityManager.getTransaction() 有什么区别

java - 如何确定 Java 类使用了哪些方法

Java Stream 在字符或字节数组中未按预期工作

java - Java 中 JWindow 的半透明背景(不使用屏幕截图)

java - 我在我的应用程序中没有发现错误。仅在少数设备上