【问题标题】:Sonarlint Error says: instead of containsKey use computeIfAbsentSonarlint 错误说:而不是 containsKey 使用 computeIfAbsent
【发布时间】:2021-12-09 09:17:30
【问题描述】:

我编写了一个不允许重复字符的应用程序。我的代码工作正常,但是声纳说“而不是 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);
                }

【问题讨论】:

  • 例外是强制性的还是您不需要保留?
  • 你好,谢谢你的回答,我的异常是 badrequest 是强制性的,所以我必须把它放在我的代码上。
  • 我怎样才能根据声纳警告更改我的代码?
  • 我还需要保持空控制

标签: java spring spring-boot java-8 sonarqube


【解决方案1】:

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

如果指定的键尚未与值关联(或映射为 null),则尝试使用给定的映射函数计算其值并将其输入到此映射中,除非为 null。

这意味着你定义的任何映射函数只会在映射没有键时被调用。由于您只是想在密钥已经可用时使用computeIfAbsent 引发异常@ 是无稽之谈。

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

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

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

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2016-08-30
    • 2015-11-12
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多