Подтвердить что ты не робот

Когда IntStream фактически закрыт? Является ли SonarQube S2095 ложным позитивным для IntStream?

Я использую потоки 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? Должно ли это? Или это ложный позитв в правиле кальмаров?

4b9b3361

Ответ 1

Он не закрыт, потому что интерфейс AutoCloseable работает только внутри try-with-resources. Но эта закрытая операция совершенно не нужна для IntStream, как сказано в интерфейсе AutoCloseable javadoc:

Однако при использовании таких средств, как java.util.stream.Stream, поддержка как форм ввода-вывода, так и не-входов-выходов, использование ресурсов блоки вообще не нужны при использовании форм, не содержащих I/O.

Итак да S2095 является ложным позитивным для IntStream. Это будет надежно зафиксировано SONARJAVA-1478