[英]Why does Java compiler allow to reuse a Stream?
讓我們想象下面的代碼:
Stream<Integer> numberStream = ...;
Predicate<Integer> isEven = ...;
Predicate<Integer> isOdd = ...;
List<Integer> evenNumbers = numberStream
.filter(isEven)
.collect(Collectors.toList());
List<Integer> oddNumbers = numberStream
.filter(isOdd)
.collect(Collectors.toList()); // this line will throw IllegalStateException
上面的代碼編譯沒有任何警告。 但是,嘗試運行它總是會導致IllegalStateException
。
查了一下,發現一個Stream
只能有一個終端操作,所以把它放在變量里面基本上沒有意義。
在我看來,這將是編譯器很容易發現的錯誤。 為什么它編譯沒有錯誤? 有沒有這樣的代碼有用的用例?
從某種意義上說,編譯器很簡單。
它根據 Java 語言的規則驗證您的代碼是否合法,並且您的所有調用都符合 Java 語言規則和類型系統要求的內容。
語言規則和類型系統都不能以某種方式“編碼” Stream
不能被重用。 這只是編譯器不知道的事實。
將流視為構建在 Java 之上的特定領域語言。 編譯器只知道該概念的較低“Java”層,但不了解較高級別 Streams“語言”的規則。
因此,盡管編譯器可能會被告知該特定語言的規則,但這是通往 go 的危險道路,因為有很多很多特定領域的語言,就像人們可以想象的那樣想要驗證並正確處理它們是...... . 不太可能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.