检查集合中的所有对象的长度应大于 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 语句,这个片段在声纳构建过程中失败
我需要什么?我要求你们与我分享上述代码的最简单版本或使用最新 JDK 重构的代码,是的,我们正在使用 JDK 11,我不太确定我需要使用的方法这种支票。
如果没有其他选择如何解决这个“循环不应包含超过一个“中断”或“继续”语句”声纳问题。
感谢您为此付出的时间和精力。
最简单的解决方案可能只是将多个 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;
}
}
}
但是,您可以像这样使用流操作,例如 filter
和 findFirst
,而无需任何 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));
}
我有这样的代码片段
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 语句,这个片段在声纳构建过程中失败
我需要什么?我要求你们与我分享上述代码的最简单版本或使用最新 JDK 重构的代码,是的,我们正在使用 JDK 11,我不太确定我需要使用的方法这种支票。
如果没有其他选择如何解决这个“循环不应包含超过一个“中断”或“继续”语句”声纳问题。
感谢您为此付出的时间和精力。
最简单的解决方案可能只是将多个 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;
}
}
}
但是,您可以像这样使用流操作,例如 filter
和 findFirst
,而无需任何 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));
}