Компилятор в некотором смысле прост.
Он проверяет, что ваш код допустим в соответствии с правилами языка Java и что все ваши вызовы соответствуют правилам и типу языка Java система требует.
Ни правило языка , ни система типов как-то не "кодирует", что Stream
не может быть повторно использовано. Это просто факт, о котором компилятор не знает.
Думайте о потоках как о предметно-ориентированном c языке, построенном поверх Java. Компилятор знает только нижний «Java» уровень этой концепции, но не понимает правил «языка» потоков более высокого уровня.
Так что пока компилятор может можно сказать о правилах этого специфического c языка, это опасный путь к go, потому что существует много, много доменных спецификаций c языков, подобных тем, которые можно было бы предположительно проверить и сделать их правильно ... маловероятно.