2016-02-25 39 views
9

當使用lambda表達式時,Java實際上會創建一個匿名(非靜態)類。非靜態內部類總是包含它們的封閉對象的引用。Java lambda表達式有沒有方法可以引用封閉對象?

當這個lambda表達式是從可以在不同的過程調用帶班未發現異常崩潰,因爲它不能找到包圍對象的類另一個進程調用拉姆達另一個庫調用。

考慮這個例子:

public class MyClass { 
    public void doSomething() { 
     remoteLambdaExecutor.executeLambda(value -> value.equals("test")); 
    } 
} 

Java將創建用於實現某些功能接口匿名內部類,並將其傳遞作爲參數executeLambda()。然後,remoteLambdaExecutor將跨進程的這個匿名類遠程運行。 遠程過程一無所知MyClass的和將拋出

java.lang.ClassNotFoundException: MyClass 

,因爲它需要MyClass的該封閉的對象引用。

我總是可以使用一個靜態實現由API所期望的功能接口,但失敗的目的,並且不使用拉姆達功能。

有沒有辦法使用lambda表達式來解決它?

更新:我不能使用任何除非它以某種方式出口到其他進程靜態類。

+0

'可以在不同的process'調用拉姆達:聽起來像一個視交叉 – wero

+0

也許Java是錯誤的語言這一點。也許你需要一種腳本語言。 –

回答

6

您的初始前提是錯誤的。 JRE將而不是生成一個匿名內部類。它可能會產生一類,但如果你的lambda表達式不訪問this或類的非static成員,它將存到this實例的引用。

但是,這並不意味着類本身是不必要的。由於該課程承載了lambda表達式的代碼,因此始終需要它。在這方面,使用static嵌套類的解決方案不會改變任何有關它的內容,因爲它是執行代碼所需的嵌套類static

如果不傳輸包含要執行的代碼的類(除非該類已存在於遠程站點),則無法將對象傳輸到遠程執行工具。

+1

換句話說,Java lambda比Lisp lambda更像C++函數指針。 Java lambda告訴你要運行的代碼,但實際上並不包含該代碼。我沒有意識到這一點。 –

+0

否則訪問周圍範圍的變量也是不可能的,請參閱https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#accessing-local-variables –

+0

Holger,你是對的。我的假設是錯誤的。問題依然存在。有沒有辦法做到這一點?也許有? – ATrubka

相關問題