声纳违规:低效使用keySet迭代器而不是entrySet迭代器

时间:2015-09-08 13:32:25

标签: java

请参考以下方法:

public Properties getProperties()
    {
        try
        {
            Properties properties = new Properties();
            loadProperties(properties);
            for (Object key : properties.keySet())
            {
                properties.setProperty((String) key, convertPropertyValue(properties.getProperty((String) key)));
            }

            // Add Config API Keys/Values
            IConfigurationManager configMgr = ConfigurationManager.getInstance();
            Map<String, Setting> settings = configMgr.getSettings();
            for (String key : settings.keySet()) {
                properties.setProperty(key, settings.get(key).getValue());
            }

            return properties;
        } catch (java.io.IOException ex)
        {
            return null;
        }
    }

当我将代码更改为settings.entrySet()而不是settings.keySet()时,它会引发以下错误:

<<< error: incompatible types
[ERROR] for (String key : settings.entrySet()) >>>

我可以理解,由于entrySet返回的密钥值对只有密钥,我收到了不兼容的错误。

如何为以下代码实现entrySet以修复声纳违规?

以下是设置键和值的setProperty()方法

public synchronized Object setProperty(String key, String value) {
    return put(key, value);
}

1 个答案:

答案 0 :(得分:7)

Map.entrySet()返回Set<Map.Entry>类型。 Map.Entry用于将每个键和相关值保持在一起。由于可以使用传统的for-each循环迭代Set,因此您可以像这样重写for循环:

for (Map.Entry<String, Setting> entry : settings.entrySet()) {
    properties.setProperty(entry.getKey(), entry.getValue().getValue());
}