我使用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)被打开但从未关闭的结果.
所以这是我的问题:终端操作是否会减少关闭流?应该是?或者这是鱿鱼规则中的误报?
解决方法:
它没有关闭,因为AutoCloseable接口只能在try-with-resources中使用.但是IntStream完全不需要这个关闭操作,因为它在AutoCloseable接口javadoc中说:
However, when using facilities such as java.util.stream.Stream that
support both I/O-based and non-I/O-based forms, try-with-resources
blocks are in general unnecessary when using non-I/O-based forms.
所以是的,S2095是IntStream的误报.这有望在SONARJAVA-1478之前修复