问题:
返回的HashMap中key有对应的value值,但取值时结果却为null。
解析-返回结果为何为null?
1. HashMap的key和value均可为null。
2.key所对应的value本身为空或null,则value返回null
3.无法找到key,则value返回null
4.key的类型与Map定义的类型不一致(同3,即找不到这个key),则value返回null
在代码实例中,由于粗心,在map.get(Key)时没有转换key的类型,导致一直返回null。
List<VoteResultDto.VoteItemResult> voteResults = resultMap.get(Long.valueOf(voteIdList.get(i)));
同理:containsKey()方法也如此,resultMap.containsKey(Long.valueOf(voteIdList.get(i)))
问题:
如何判定Map中存在某个Key?
解析-在Map集合中如何判断是否存在某个键(key)?
1.HashMap的key和value均可为null
2.由1并不能明确返回的null时key为null,还是value为null,即key存在的情况下,value也可能为null,key不存在时,必然返回null。
3.所以不能通过map.get()方法来判断是否存在某个key
4.方法一:直接使用java api提供的map.containsKey()。
方法二:循环遍历,逐个比较。
public static void main(String[] args) {
Map<String, String> map = Maps.newHashMap();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
//方法1
System.out.println(map.containsKey("5"));
//方法2
Iterator keys = map.keySet().iterator();
String key;
while(keys.hasNext()){
key = (String) keys.next();
if ("1".equals(key)) {
System.out.println("存在");
}
}
}
题外话:
取List中的属性值,分别作为Map的key,value。java8特性
Map<Long, Long> map = votelist.stream().collect(Collectors.toMap(k -> k.getVoteId(), v -> v.getItemId()));
问题:
使用上述方式将List转换成Map时,提示报错:java.lang.IllegalStateException: Duplicate key 2
解析:
在List转换成Map时,由于Map中的key不唯一,即出现了重复的key,导致报错。
原因:需要使用了stream包下Collectors.toMap方法的另一个重载方法的参数,这个参数可以传一个合并的函数解决冲突。
方案如下:Map<Long, Long> map = votelist.stream().collect(Collectors.toMap(k -> k.getVoteId(), v -> v.getItemId(), (oldData,newData)->newData));