我使用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
关闭了流吗?应该是?或者这是鱿鱼规则中的误报?
答案 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
解决这个问题