簡體   English   中英

為什么 Java 編譯器允許重用 Stream?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM