IntStream何时实际关闭? SonarQube S2095对IntStream是误报吗?

时间:2016-01-13 14:07:41

标签: java java-8 sonarqube

我使用Java 8流代替许多旧式for循环来迭代一堆结果并生成摘要统计信息。例如:

int messages = IntStream.rangeClosed(0, 7).map(ids::get).reduce(Integer::sum).getAsInt();

注意:我知道还有其他方法可以进行上面显示的计数。我这样做是为了说明我的问题。

我正在使用SonarQube 5.3和Java 3.9插件。在该配置中,上面的代码行违反了squid规则S2095:"资源应该关闭。"这是我期望看到AutoCloseable(例如,FileInputStream)被打开但从未关闭的结果。

所以我的问题是:终端操作reduce关闭了流吗?应该是?或者这是鱿鱼规则中的误报?

1 个答案:

答案 0 :(得分:9)

它尚未关闭,因为AutoCloseable界面仅在try-with-resources内有效。但IntStream正如AutoCloseable接口javadoc所述,这种近距离操作完全没有必要:

  

但是,当使用java.util.stream.Stream这样的工具时   支持基于I / O和非I / O的表单,try-with-resources   在使用非基于I / O的表单时,通常不需要块。

所以 S2095是IntStream的误报。希望通过SONARJAVA-1478

解决这个问题