Java 所有值都会添加到HashMap中,但只返回最后一个值

Java 所有值都会添加到HashMap中,但只返回最后一个值,java,hashmap,jakarta-mail,return-value,Java,Hashmap,Jakarta Mail,Return Value,在下面的方法demoReadEmail2(String folderName)中,我只得到HashMap的最后一个元素。然而,在调试和打印期间,所有值都得到了正确的处理 public Map<String, Object> demoReadEmail2(String folderName) throws MessagingException,IOException { Map<String, Object> stringObjectHashMap = new Ha

在下面的方法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;
} 
publicmap demoReadEmail2(字符串folderName)抛出MessaginException、IOException{
Map stringObjectHashMap=新建HashMap();
for(消息: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);
}
返回stringObjectHashMap;
} 

您在循环中填充映射,在每次迭代中压碎与相同键关联的值。看

你最多只能有。。。地图中每个键都有一个条目(
“从”
“到”
,…)

如果需要跟踪与同一个键关联的多个值,可以使用
映射来代替:请参阅本主题。

另一种选择是
列出
或将索引信息添加到条目键中:例如
From1
。。。(通过使用循环中的索引)。

在循环中填充贴图,在每次迭代中压碎与相同键关联的值。看

你最多只能有。。。地图中每个键都有一个条目(
“从”
“到”
,…)

如果需要跟踪与同一个键关联的多个值,可以使用
映射来代替:请参阅本主题。

另一种选择是
列出
或将索引信息添加到条目键中:例如
From1
。。。(通过使用循环中的索引)。

问题在于每次执行循环时都会覆盖HashMap属性。实现您想要的一种方法是拥有一个
集合
,就像一个
列表
,这样:

public List demoReadEmail2(字符串folderName)抛出MessaginException、IOException{
List myList=new ArrayList();
for(消息:getUnseenMailsByCurrentDate(folderName)){
Map stringObjectHashMap=新建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());
添加(stringObjectHashMap);
}
返回myList;
} 

问题在于每次执行循环时都会覆盖HashMap属性。实现您想要的一种方法是拥有一个
集合
,就像一个
列表
,这样:

public List demoReadEmail2(字符串folderName)抛出MessaginException、IOException{
List myList=new ArrayList();
for(消息:getUnseenMailsByCurrentDate(folderName)){
Map stringObjectHashMap=新建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());
添加(stringObjectHashMap);
}
返回myList;
} 

映射将键映射到单个值:

Map<String,String> map = new HashMap();
map.put("key1", "value1");   // Puts value1 in map
map.put("key1", "value2");   // Overwrites value1
Map Map=newhashmap();
map.put(“键1”、“值1”);//将值1放入映射中
map.put(“键1”、“值2”);//覆盖值1
所以这取决于你想做什么

如果您想要所有“来源”的列表,请为每个零件创建单独的列表:

List<String> froms = new ArrayList();
froms.add(fromValue);
List froms=new ArrayList();
froms.add(fromValue);
如果需要具有多个值的贴图,请使用多重贴图


谷歌“java教程集合”提供一个不错的教程。

地图将一个键映射到一个值:

Map<String,String> map = new HashMap();
map.put("key1", "value1");   // Puts value1 in map
map.put("key1", "value2");   // Overwrites value1
Map Map=newhashmap();
map.put(“键1”、“值1”);//将值1放入映射中
map.put(“键1”、“值2”);//覆盖值1
所以这取决于你想做什么

如果您想要所有“来源”的列表,请为每个零件创建单独的列表:

List<String> froms = new ArrayList();
froms.add(fromValue);
List froms=new ArrayList();
froms.add(fromValue);
如果需要具有多个值的贴图,请使用多重贴图


谷歌“java教程集合”是一个不错的教程。

不管有多少
消息
对象
getUnseenMailsByCurrentDate(folderName)
返回。。。您使用的是同一组键,并且地图只支持每个键一个条目。因此,只有最后一条
消息将反映在地图中。也许您希望返回一个
列表
。为了帮助您思考这个问题,请思考您希望在生成的映射中包含哪些键和值。如果您从“
键”想象多个
,那么您所想象的不是地图的工作方式,因此您需要返回并以不同的方式指定问题。我建议返回一个
列表
对于一个方法来说应该足够了,然后将一条
消息
转换成
映射
对于另一个方法来说应该足够了。不管有多少
消息
对象
getUnseenMailsByCurrentDate(folderName)
返回。。。您使用的是同一组键,并且地图只支持每个键一个条目。仅此而已