Sonarlint 错误说:而不是 containsKey 使用 computeIfAbsent

Sonarlint Error says: instead of containsKey use computeIfAbsent

我写了一个不允许重复字符的应用程序。我的代码工作正常,但是声纳说“而不是 containsKey 使用 computeIfAbsent”。我怎样才能克服声纳警告?

我的代码如下:

if (promoRequest.getCharset() != null) {
    Map<Character, Integer> map = new HashMap<>();
    
    for (char charsetCharacter : promoRequest.getCharset().toCharArray()) {
        if (map.containsKey(charsetCharacter)) {
            throw new BadRequestException(Constants.INCLUDE_MUST_NOT_BE_DUPLICATED);
        }
        map.put(charsetCharacter, 1);
    }
}

我已经解决了问题

for (char charsetCharacter : promoRequest.getCharset().toCharArray()) {

                if (!map.containsKey(charsetCharacter)) {

                    map.put(charsetCharacter, 1);

                } else {

                    throw new BadRequestException(Constants.CHARSET_CHARACTER_INCLUDE_MUST_NOT_BE_DUPLICATED);
                }

由于您需要保留例外,因此使用 computeIfAbsent 没有任何好处。参考文档说明如下:

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null.

这意味着您定义的任何映射函数都只会在映射还没有键的情况下被调用。因为您只是想在密钥已经可用时抛出异常,所以使用 computeIfAbsent 是无稽之谈。

话虽如此,只需保留您的代码并忽略声纳警告即可。请记住,声纳分析是一种静态分析,它会在您的代码中寻找模式,但这并不总是适用于您在代码中尝试执行的任何操作。

如果例外不是强制性的,那么您可以做一些更简单的事情:

if (promoRequest.getCharset() != null) {
    Map<Character, Integer> map = new HashMap<>();
    
    for (char charsetCharacter : promoRequest.getCharset().toCharArray()) {
        map.putIfAbsent(charsetCharacter, 1);
    }
}