Я использую потоки Java 8 вместо многих старых стилей для циклов, чтобы перебирать кучу результатов и создавать сводную статистику. Например:
int messages = IntStream.rangeClosed(0, 7).map(ids::get).reduce(Integer::sum).getAsInt();
Примечание. Я знаю, что есть другие способы сделать подсчет, который я покажу выше. Я делаю это так, чтобы проиллюстрировать мой вопрос.
Я использую SonarQube 5.3 с плагином Java 3.9. В этой конфигурации приведенная выше строка кода дает мне нарушение правила кальмара S2095: "Ресурсы должны быть закрыты". В результате я бы ожидал увидеть, был ли открыт AutoCloseable (например, FileInputStream), но никогда не закрывался.
Итак, вот мой вопрос: закрывает ли терминал операция reduce
? Должно ли это? Или это ложный позитв в правиле кальмаров?