【发布时间】:2016-04-18 13:14:07
【问题描述】:
我正在使用 Java 8 流代替许多旧样式的 for 循环来遍历一堆结果并生成汇总统计信息。例如:
int messages = IntStream.rangeClosed(0, 7).map(ids::get).reduce(Integer::sum).getAsInt();
注意:我知道还有其他方法可以进行上面显示的计数。我这样做是为了说明我的问题。
我正在使用带有 Java 3.9 插件的 SonarQube 5.3。在该配置中,上面的代码行违反了 squid 规则 S2095:“资源应该关闭。”这就是我希望看到 AutoCloseable(例如 FileInputStream)是否已打开但从未关闭的结果。
所以这是我的问题:终端操作reduce 是否关闭了流?应该是?或者这是鱿鱼规则中的误报?
【问题讨论】:
-
IntStream具有从BaseStream类继承的onClose(Runnable closeHandler)方法。您可以使用此处理程序检查流何时关闭或未关闭。