所有值都添加到 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" 一个很好的教程。