所有值都添加到 HashMap 中,但只返回最后一个值
All values get added in HashMap, but only the last values get returned
在下面的方法 demoReadEmail2(String folderName) 中,我只得到 HashMap
的最后一个元素。但是在调试和打印期间所有值都正确。
public Map<String, Object> demoReadEmail2(String folderName) throws MessagingException,IOException {
Map<String, Object> stringObjectHashMap = new HashMap<>();
for (Message message : getUnseenMailsByCurrentDate(folderName)) {
stringObjectHashMap.put("From",message.getFrom()[0]);
stringObjectHashMap.put("To",Arrays.toString(message.getRecipients(Message.RecipientType.TO)));
stringObjectHashMap.put("CC",Arrays.toString(message.getRecipients(Message.RecipientType.CC)));
stringObjectHashMap.put("BCC",Arrays.toString(message.getRecipients(Message.RecipientType.BCC)));
stringObjectHashMap.put("Subject",message.getSubject());
System.out.println(stringObjectHashMap);
}
return stringObjectHashMap;
}
您正在循环中填充地图,在每次迭代中粉碎与相同键关联的值。参见 Put Java doc
您最多可能有...映射中每个键的一个条目("From"
、"To"
、...)。
如果您需要跟踪与同一个键关联的多个值,您可以使用 Map<String, List<Object>>
代替:请参阅此 Key Collision 主题。
另一种选择是 List<Map<String, Object>>
或将索引信息添加到您的条目键:例如From1
, ...(通过在循环中使用索引)。
问题是每次执行循环时您都在覆盖 HashMap 属性。一种实现您想要的方法是使用 Collection
,例如 List
,这样:
public List<Map<String, Object>> demoReadEmail2(String folderName) throws MessagingException,IOException {
List<Map<String, Object>> myList = new ArrayList<>();
for (Message message : getUnseenMailsByCurrentDate(folderName)) {
Map<String, Object> stringObjectHashMap = new HashMap<>();
stringObjectHashMap.put("From",message.getFrom()[0]);
stringObjectHashMap.put("To",Arrays.toString(message.getRecipients(Message.RecipientType.TO)));
stringObjectHashMap.put("CC",Arrays.toString(message.getRecipients(Message.RecipientType.CC)));
stringObjectHashMap.put("BCC",Arrays.toString(message.getRecipients(Message.RecipientType.BCC)));
stringObjectHashMap.put("Subject",message.getSubject());
myList.add(stringObjectHashMap);
}
return myList;
}
映射将键映射到单个值:
Map<String,String> map = new HashMap();
map.put("key1", "value1"); // Puts value1 in map
map.put("key1", "value2"); // Overwrites value1
所以这取决于你想做什么。
如果您想要所有 "From" 的列表,请为每个部分创建单独的列表:
List<String> froms = new ArrayList();
froms.add(fromValue);
如果您想要一个具有多个值的 Map,请使用 Multimap。
Google "java tutorials collections" 一个很好的教程。
在下面的方法 demoReadEmail2(String folderName) 中,我只得到 HashMap
的最后一个元素。但是在调试和打印期间所有值都正确。
public Map<String, Object> demoReadEmail2(String folderName) throws MessagingException,IOException {
Map<String, Object> stringObjectHashMap = new HashMap<>();
for (Message message : getUnseenMailsByCurrentDate(folderName)) {
stringObjectHashMap.put("From",message.getFrom()[0]);
stringObjectHashMap.put("To",Arrays.toString(message.getRecipients(Message.RecipientType.TO)));
stringObjectHashMap.put("CC",Arrays.toString(message.getRecipients(Message.RecipientType.CC)));
stringObjectHashMap.put("BCC",Arrays.toString(message.getRecipients(Message.RecipientType.BCC)));
stringObjectHashMap.put("Subject",message.getSubject());
System.out.println(stringObjectHashMap);
}
return stringObjectHashMap;
}
您正在循环中填充地图,在每次迭代中粉碎与相同键关联的值。参见 Put Java doc
您最多可能有...映射中每个键的一个条目("From"
、"To"
、...)。
如果您需要跟踪与同一个键关联的多个值,您可以使用 Map<String, List<Object>>
代替:请参阅此 Key Collision 主题。
另一种选择是 List<Map<String, Object>>
或将索引信息添加到您的条目键:例如From1
, ...(通过在循环中使用索引)。
问题是每次执行循环时您都在覆盖 HashMap 属性。一种实现您想要的方法是使用 Collection
,例如 List
,这样:
public List<Map<String, Object>> demoReadEmail2(String folderName) throws MessagingException,IOException {
List<Map<String, Object>> myList = new ArrayList<>();
for (Message message : getUnseenMailsByCurrentDate(folderName)) {
Map<String, Object> stringObjectHashMap = new HashMap<>();
stringObjectHashMap.put("From",message.getFrom()[0]);
stringObjectHashMap.put("To",Arrays.toString(message.getRecipients(Message.RecipientType.TO)));
stringObjectHashMap.put("CC",Arrays.toString(message.getRecipients(Message.RecipientType.CC)));
stringObjectHashMap.put("BCC",Arrays.toString(message.getRecipients(Message.RecipientType.BCC)));
stringObjectHashMap.put("Subject",message.getSubject());
myList.add(stringObjectHashMap);
}
return myList;
}
映射将键映射到单个值:
Map<String,String> map = new HashMap();
map.put("key1", "value1"); // Puts value1 in map
map.put("key1", "value2"); // Overwrites value1
所以这取决于你想做什么。
如果您想要所有 "From" 的列表,请为每个部分创建单独的列表:
List<String> froms = new ArrayList();
froms.add(fromValue);
如果您想要一个具有多个值的 Map,请使用 Multimap。
Google "java tutorials collections" 一个很好的教程。