检查集合中的所有对象的长度应大于 0

Check all objects inside collection should have length greater than 0

我有这样的代码片段

if (CollectionUtils.isNotEmpty(target.getSpecifications())) {
            for (final SpecificationData data : target.getSpecifications()) {
                if (StringUtils.isNotEmpty(data.getModelName())) {
                    productLinks.add(DETAILS);
                    break;
                } else if (StringUtils.isNotEmpty(data.getModelNumber())) {
                    productLinks.add(DETAILS);
                    break;
                } else if (StringUtils.isNotEmpty(data.getMaterial())) {
                    productLinks.add(DETAILS);
                    break;
                } else if (StringUtils.isNotEmpty(data.getColour())) {
                    productLinks.add(DETAILS);
                    break;
                }
            }
        }

如您所见,我正在迭代一个集合并进行检查,以便在前端填充 link“详细信息”。我的想法是我需要填充此 link 当前对象中的至少一个属性长度应该 > 0。因为事实上,我使用了这么多 break 语句,这个片段在声纳构建过程中失败

  1. 我需要什么?我要求你们与我分享上述代码的最简单版本或使用最新 JDK 重构的代码,是的,我们正在使用 JDK 11,我不太确定我需要使用的方法这种支票。

  2. 如果没有其他选择如何解决这个“循环不应包含超过一个“中断”或“继续”语句”声纳问题。

感谢您为此付出的时间和精力。

最简单的解决方案可能只是将多个 if 语句合并为一个语句,尽管它可能对 Sonar 规则没有帮助:)

if (CollectionUtils.isNotEmpty(target.getSpecifications())) {
    for (final SpecificationData data : target.getSpecifications()) {
        if (StringUtils.isNotEmpty(data.getModelName())
            || StringUtils.isNotEmpty(data.getModelNumber())
            || StringUtils.isNotEmpty(data.getMaterial())
            || StringUtils.isNotEmpty(data.getColour())
        ) {
            productLinks.add(DETAILS);
            break;
        } 
    }
}

但是,您可以像这样使用流操作,例如 filterfindFirst,而无需任何 for 循环和 break 语句:

if (CollectionUtils.isNotEmpty(target.getSpecifications())) {
    target.getSpecifications().stream()
        .filter(x ->
            Stream.of(x.getModelName(), x.getModelNumber(), x.getMaterial(), x.getColour())
                  .filter(StringUtils::isNotEmpty)
                  .findFirst()
                  .isPresent()
        )
        .findFirst()
        .ifPresent(x -> productLinks.add(DETAILS));
}

更新

对于这种特定情况,也可以使用 flatMap 检测任何第一个非空 属性 并执行操作:

if (CollectionUtils.isNotEmpty(target.getSpecifications())) {
    target.getSpecifications().stream()
        .flatMap(x -> Stream.of(x.getModelName(), x.getModelNumber(), x.getMaterial(), x.getColour()))
        .filter(StringUtils::isNotEmpty)
        .findFirst()
        .ifPresent(x -> productLinks.add(DETAILS));
}