Lambda 表達式:堆分配和效能影響
在Java 8 中,lambda 表達式為編寫程式碼提供了簡潔且函數式的語法。然而,人們擔心 lambda 表達式每次執行時是否都會在堆上建立新對象,尤其是在迭代集合時。
Lambda 表達式與物件建立
使用傳統匿名類別方法的lambda 表達式的等效語法是:
myStream.forEach(new Consumer<Item>() { @Override public void accept(Item item) { // do something useful } });
在這兩種情況下,lambda 表達式或建立匿名類別實例來表示對集合的每個元素執行的操作。然而,關鍵的差異在於它們的實現方式。
Java 語言規範指定的行為
Java 語言規格規定 lambda 表達式並非總是建立一個每次評估的新物件。 JVM 在處理 lambda 表達式方面具有靈活性,包括物件的重用以及基於捕獲的變數的最佳化。
具體來說,規範允許以下場景:
目前 Oracle JVM實作
目前,Oracle 的 JVM 採用保守的方法,為每個 lambda 表達式建立一個實例。但是,單例用於不捕獲值的 lambda 表達式。這意味著在大多數情況下,使用 lambda 表達式迭代集合時不會在堆上分配新物件。
效能影響
為 lambda 物件分配的堆空間可以忽略不計,特別是小型收藏。效能影響主要與非單例 lambda 表達式情況下建立新物件的開銷有關,這通常是微不足道的。
結論
而lambda 表達式提供了一種方便且富有表現力的程式碼編寫方式,它們通常不會導致嚴重的堆疊分配或效能問題,特別是在使用最佳化編譯器時。開發人員通常可以使用 lambda 表達式,而不必擔心過多的物件建立或堆疊消耗。
以上是Java Lambda 表達式是否會導致嚴重的堆分配和效能問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!