【发布时间】:2010-03-12 20:46:21
【问题描述】:
我在本地存储中有一个用户列表,我需要每隔一段时间从远程用户列表中更新它。基本上:
- 如果本地已存在远程用户,请更新其字段。
- 如果本地不存在远程用户,请添加该用户。
- 如果本地用户未出现在远程列表中,请停用或删除。
- 如果本地用户也出现在远程列表中,请更新其字段。 (同1)
例如。 远程列表:User(1, true), User(2, true), User(4, true), User(5, true)
本地列表:User(1, true), User(2, false), User(3, true), User(6, true)
新建本地列表:User(1, true), User(2, true), User(3, false), User(4, true), User(5, true), User(6, false),
只是同步本地列表的一个简单案例。在纯 Java 中是否有比以下更好的方法来做到这一点?看着自己的代码,我觉得很恶心。
public class User {
Integer id;
String email;
boolean active;
//Getters and Setters.......
public User(Integer id, String email, boolean active) {
this.id = id;
this.email = email;
this.active = active;
}
@Override
public boolean equals(Object other) {
boolean result = false;
if (other instanceof User) {
User that = (User) other;
result = (this.getId() == that.getId());
}
return result;
}
}
public static void main(String[] args) {
//From 3rd party
List<User> remoteUsers = getRemoteUsers();
//From Local store
List<User> localUsers =getLocalUsers();
for (User remoteUser : remoteUsers) {
boolean found = false;
for (User localUser : localUsers) {
if (remoteUser.equals(localUser)) {
found = true;
localUser.setActive(remoteUser.isActive());
localUser.setEmail(remoteUser.getEmail());
//update
}
break;
}
if (!found) {
User user = new User(remoteUser.getId(), remoteUser.getEmail(), remoteUser.isActive());
//Save
}
}
for(User localUser : localUsers ) {
boolean found = false;
for(User remoteUser : remoteUsers) {
if(localUser.equals(remoteUser)) {
found = true;
localUser.setActive(remoteUser.isActive());
localUser.setEmail(remoteUser.getEmail());
//Update
}
break;
}
if(!found) {
localUser.setActive(false);
// Deactivate
}
}
}
【问题讨论】:
-
1和4只需要做一次,它们是一样的
-
您可以提取一些方法(例如
User类中的update(User user)会将user的字段设置为this)。您也可以在 for-comprehensions 中使用java.util.Collections.binarySearch(list, user)。
标签: java collections list-comprehension