仔细检查是否存在地图元素?

时间:2014-12-19 08:41:14

标签: java dictionary

在我正在处理的代码中,我遇到了以下内容:

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元素。我可能不会有一个隐藏的想法吗?

3 个答案:

答案 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(...));
}

关键在于编写这个三元嵌套语句的程序员虽然代码较少,但最后,你会发现它只是令人困惑。总是写可读代码!