2017-01-02 82 views
3

我想知道爲什麼Java 8不包含對數組使用流的支持,就像它在集合上使用流一樣。你可以寫爲什麼Java 8沒有「myArray.stream()」函數?

Collection<String> myCollection = new ArrayList<String>(); 
    Stream<String> stream = myCollection.stream(); 

,但你不能寫:

String[] myArray = new String[] {}; 
    Stream<String> stream = myArray.stream(); 

我知道的實用方法Arrays.stream的,所以這是可以用來代替:

Stream<String> stream = Arrays.stream(myArray); 

但它給我留下想知道爲什麼這種笨拙的靜態實用方法調用在lambda表達式允許簡單編碼這麼多的上下文中是必需的。我意識到Collection(基於對象/接口的)世界與array更「本土」世界之間的顯着差異。

誰能詳細說明這一點?

+0

有人會比我回答得更好,但是數組是Java中特殊的對象,這不是來自像'Collection'這樣的特定類/接口。你沒有'Array '而是'String []',這是特定於數組的 – AxelH

+2

爲什麼'stream'特別是? 「Collection」接口中的其他方法呢? –

回答

1

該陣列完全在Java Language Specfication中指定。所有Collection類只是API的一部分。正如你可能想象的那樣,對規範的修改比對API的修改更昂貴。

你的建議不僅僅意味着對規範的補充,而且類流在語言規範中是已知的。儘管這在技術上是可行的(例如參見ClassObject),但這不是很常見。請注意,即使Collection類也是語言規範的一部分。

3

東西非常接近,你的建議是discussed但功能要求遭到拒絕:

什麼你的建議是一個不小的語言功能,以提供糖的一個小一點的東西你已經可以輕易做到與圖書館。所以,雖然我們已經考慮過添加一種將方法注入數組的機制,但僅僅以這種方式包裝數組的方便性意味着我們可能更好地將複雜性預算花費在其他地方,除非我們可以從其他方面獲得其他更大的好處這個。

+0

感謝您的鏈接!在那次討論中,我還發現這個提示非常有用:'主要的問題是目前在數組類型上沒有'真正'的方法,所以通常虛擬機有一種特殊的方式來表示它們,你提出的建議確實需要從VM的觀點。' – SebastianH

+0

關於第二個想法和進一步的研究,這個報價實際上是錯誤的!無需更改虛擬機。它可以由編譯器處理。如果我沒有弄錯,Java 8已經將'::'方法作爲參數語言擴展使用。 – SebastianH

6

爲了向數組添加方法,需要更改語言而不是庫。與在類文件中定義成員的「常規」對象不同,數組的成員定義爲directly in the language specification

這意味着添加myArray.stream()方法需要更改語言規範,並向編譯器添加支持。這種方法比添加Arrays.stream(myArray)複雜得多,可以在Java類庫中完全實現,只需很少的努力。