如何解决声纳问题squid:forloopcounterchangedcheck?

juud5qan  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(271)

我的代码被声纳检测到,违反“for”循环停止条件应该是不变的。我试图修复它,但声纳认为问题仍然存在,因为我的for循环在另一个for循环中。
下面是代码片段:

int limit = Const.getBatchLimit();
int count = 0;

for (int paramIndex = 0; paramIndex < paramList.size();)
{
    List<Param> tempParam = new ArrayList<>();
    StringBuilder retrieveMsg = new StringBuilder("Retrieving: \n");
    for (count = 0; (count < limit) && (paramIndex < param.size()); count++, paramIndex++)
    {
        Param myParam = paramList.get(paramIndex);
        retrieveMsg.append(myParam .seq()).append(Str.SLASH).append(Str.CRLF);
        tempParam.add(myParam);
    }
    LOGGER.info(retrieveMsg.toString());

    LOGGER.info("Done. Retrieved count: " + tempParam.size());
}

我无法将paramindex++移到第一个for循环,因为行为将与所需的不同。
如果有人能就如何纠正这一违规行为提出建议,我们将不胜感激。先谢谢你。

fjnneemd

fjnneemd1#

将参数列表拆分为 limit 但它可能完全摆脱嵌套循环。
另外,如果 tempParam 仅用于跟踪批处理中的元素数,可以通过重用来替换 count .

int limit = Const.getBatchLimit();

StringBuilder retrieveMsg = new StringBuilder("Retrieving: \n");

for (int i = 0, count = 1, n = paramList.size(); i < n; i++, count++) {
    Param myParam = paramList.get(i);
    retrieveMsg.append(myParam.seq()).append(Str.SLASH).append(Str.CRLF);

    if (count % limit == 0 || i == n - 1) {
        LOGGER.info(retrieveMsg.toString());
        LOGGER.info("Done. Retrieved count: " + count);
        retrieveMsg = new StringBuilder("Retrieving: \n");
        count = 0;
    }
}

或者可以完全重构这些代码,以使用JavaStreamAPI并实现一个helper方法来处理块(例如。 printChunk ):

int chunks = paramList.size() / limit + (paramList.size() % limit == 0 ? 0 : 1);
IntStream.range(0, chunks)
         .mapToObj(i -> paramList.subList(i * limit, Math.min((i + 1) * limit, paramList.size()))) // getting stream of sublists
         .forEach(MyClass::printChunk);

// ...
static void printChunk(List<Param> chunk) {
    StringBuilder msg = new StringBuilder("Retrieving:\n");
    chunk.forEach(p -> msg.append(p.seq()).append(Str.SLASH).append(Str.CRLF));

    LOGGER.info(msg.toString());
    LOGGER.info("Done. Retrieved count: " + chunk.size());
}

相关问题