在我正在处理的代码中,我遇到了以下内容:
PartnerReportItem item = (map.get(partnerId) == null) ? null
: map.get(partnerId).get(platform); //1, check for existence
if (item == null) {
item = new PartnerReportItem();
item.setPlatform(platform);
item.setPartnerId(partnerId);
item.setPartnerEmail(partner.getEmail());
item.setPartnerPaymentDetails(paymentDetails);
item.setPartnerCoef(partner.getCoef());
item.setExchangeMap(exchangeMap);
if (!map.containsKey(partnerId)) //2, double check for existence??
map.put(partnerId, new HashMap<Platform, PartnerReportItem>());
map.get(partnerId).put(platform, item);
}
我对//1
和//2
感到困惑,因为我觉得// 2在这里是不必要的。我们已经检查了地图中是否存在partnerId
元素。我可能不会有一个隐藏的想法吗?
答案 0 :(得分:4)
该项可能为null,因为map.get没有返回任何内容(外部地图不存在),或者因为内部地图不包含请求的对象。因此,执行第二次检查以检测item
变为空的实际原因。
答案 1 :(得分:1)
看起来你在地图中有一张地图。
PartnerReportItem item = (map.get(partnerId) == null) ? null : map.get(partnerId).get(platform);
如果item
不为空,则表示在外部地图中找到partnerId
,并在内部地图中找到platform
。
但是,如果item
为空,则外部地图中仍可能存在partnerId
密钥,这意味着必要时会检查containsKey。
答案 2 :(得分:1)
正如其他答案所述,您需要保持此检查。但实际上这是一个糟糕的编码,因为有多个原因与PartnerReportItem
实例无关(因此第一个if语句中的第二个检查)无关。
您最好将其拆分以使意图更清晰(并避免在其他人阅读您的代码时出现混淆)。
Map<Platform, PartnerReportItem> innerMap = map.get(partnerId);
if(innerMap == null) {
innerMap = new HashMap<Platform, PartnerReportItem>();
innerMap.put(partnerId, createPartnerReportItem(...));
} else {
PartnerReportItem item = innerMap.get(partnerId);
if(item == null) {
innerMap.put(partnerId, createPartnerReportItem(...));
}
}
或其他变体:
Map<Platform, PartnerReportItem> innerMap = map.get(partnerId);
if(innerMap == null) {
innerMap = new HashMap<Platform, PartnerReportItem>();
}
PartnerReportItem item = innerMap.get(partnerId);
if(item == null) {
innerMap.put(partnerId, createPartnerReportItem(...));
}
关键在于编写这个三元嵌套语句的程序员虽然代码较少,但最后,你会发现它只是令人困惑。总是写可读代码!