IntStream何时实际关闭? SonarQube S2095对IntStream是误报吗?
我使用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
关闭流? 应该是? 或者这是鱿鱼规则的假阳性?
它没有关闭,因为AutoCloseable
接口只能在try-with-resources
。 但是这个关闭操作对于IntStream
完全没有必要,因为它在AutoCloseable
接口javadoc
:
但是,当使用支持基于I / O和非I / O的表单的java.util.stream.Stream等工具时,使用非I / O时通常不需要try-with-resources块。基础表格。
所以是的, S2095 是 IntStream的误报。 希望由SONARJAVA-1478修复