我正在尝试通过构建包含用户名作为键并将用户对象作为值的映射来同步到用户列表。一旦构建了地图,我就很难检索到对象值。下面是我正在使用的代码。
private Map<String, User> map = new HashMap<String, User>();
我正在填充地图键和对象,如下所示。
List<User> users = session.createCriteria(User.class).list();
for(ApplicationUser user : users) {
map.put(user.getUserName(), user);
}
我正在尝试检索以下数据,
List<Person> persons = session.createCriteria(Person.class).list();
for (Person p : persons) {
User user = map.containsKey(p.getUsername()) ? map.get(p.getUsername()) : new User();
//Email is always null.
System.out.println(user.getEmail());
}
有人可以帮我指出如何从地图中检索对象值的正确方向。感谢
答案 0 :(得分:4)
首先,您应该将循环更改为:
for (Person p : persons) {
String username = p.getUsername();
User user = map.get(username);
if (user != null) {
System.out.println(user.getEmail());
} else {
System.out.println("User " + username + " is unknown");
}
}
然后在循环中设置断点并调试代码。到目前为止看起来是正确的您可能只是在email
中设置User
,或者persons
中的用户不在map
。
答案 1 :(得分:0)
似乎电子邮件是空的,因为您没有在User()的默认构造函数中初始化电子邮件,这些构造函数在此处执行:
用户user = map.containsKey(p.getUsername())? map.get(p.getUsername()):new User();
在这里,我认为您在地图中放置的用户名与您尝试在代码的第二部分中检索的用户名不匹配。即map.containsKey(p.getUsername())似乎返回false,默认构造函数被调用,电子邮件为null。
尝试打印(或调试检查)map keyset()和person用户名,并检查它们是否完全匹配。
答案 2 :(得分:-1)
@George我想如果用户不属于person,你会得到一个nullpointer异常。
System.out.println(user.getEmail());
当条件为假时用户user = new User(); user.getEmail()为null