如何解决 Java 流 "Refactor the code so this stream pipeline is used" 上的 Sonar 问题

How to remove Sonar issue on Java stream "Refactor the code so this stream pipeline is used"

我正在处理一个项目 (Java 17),其中我有一个包含两个属性的对象列表,actionId(字符串)和 right(布尔值)。我正在尝试使用 right = true 获取对象的 actionId 并将结果存储为字符串列表。

这是我的代码:

 List<String> usserValidActionsArray = userActionGatewayDTO.stream().filter(UserActionGatewayDTO::getRight)
      .map(UserActionGatewayDTO::getActionId).toList();

我的代码工作正常,但 Sonar 阻止我说:

Refactor the code so this stream pipeline is used

任何人都可以建议我如何改进我的代码以使其合规吗?

我猜Sonar不知道Stream.toList()(在Java16中介绍过),以为是non-terminal操作。这似乎是错误 SONAR-3746 (see also Stream#toList (JDK 16) is not recognized as terminal operator)。这个问题应该在SonarLint 7.2中得到解决。

我猜,这意味着你需要 SonarQube 9 或更高版本,因为 SonarQube 9.0 是第一个宣布支持 Java 16 的版本,而 SonarQube 9.1 提到为 Java 16 添加新规则。但是,我不熟悉 SonarLint 和 SonarQube 更新如何以这种方式交互。

作为解决方法,您可以将 toList() 替换为 collect(Collectors.toList())