声纳不';t增加'的圈复杂度得分;forEach&x27;java中的循环

声纳不';t增加'的圈复杂度得分;forEach&x27;java中的循环,java,sonarlint,cyclomatic-complexity,Java,Sonarlint,Cyclomatic Complexity,假设我有以下代码 map.forEach((key, value) -> { //No Sonar cyclomatic complexity score for (String s : value) { //Sonar lint : +2 (including 1 for nesting) if (condition) {...} //Sonar lint : +3 (including 2 for nesting) } } 如上所述,对于for-lo

假设我有以下代码

map.forEach((key, value) -> { //No Sonar cyclomatic complexity score

  for (String s : value) {   //Sonar lint : +2 (including 1 for nesting) 
    if (condition) {...}     //Sonar lint : +3 (including 2 for nesting)
  }

}
如上所述,对于for-loop声纳,综合考虑线性结构破坏和嵌套两个因素,得分为2。那很好

map.forEach((key, value) -> { //No Sonar cyclomatic complexity score

  value.forEach(s-> {        //No Sonar cyclomatic complexity score
    if (condition) {...}     //Sonar lint : +3 (including 2 for nesting)
  }); 

}
但是,如果我像上面那样为forEach循环重构for循环,那么声纳对for循环的圈复杂度的所有抱怨都会消失。但是正如您看到的if语句,圈复杂度是相同的。这意味着对于if语句,Sonar考虑嵌套的相同分数(分数为2),这意味着嵌套的级别低于2级(因为它位于两个forEach语句之下)

我的问题是Sonar没有计算forEach循环在结构和嵌套方面的圈复杂度,尽管它已经计算了if语句的结构和嵌套圈复杂度,但其背后的逻辑是什么。这是正确的还是SonarLint插件中的一些错误

方法(或构造函数)的圈复杂度是数字 通过该方法的可能线性独立的执行路径 (见[维基百科])。它最初是作为一种复杂性引入的 托马斯·麦卡比(Thomas McCabe)[McCabe]测量

这与for-each vs-for循环无关,这只是因为lambda表达式,lambda表达式使其成为匿名方法调用,因此它不被认为是方法的圈复杂度,因为它在方法中成为线性路径