2015-11-29 85 views
3

我使用retrolambda在Android上使用嘗試lambda表達式。在下面的代碼我需要添加監聽器是接口:Lambda表達式 - 不能設置拉姆達參數作爲參數傳遞給方法

public interface LoginUserInterface { 

     void onLoginSuccess(LoginResponseEntity login); 

     void onLoginFail(ServerResponse sr); 
    } 

代碼

private void makeLoginRequest(LoginRequestEntity loginRequestEntity) { 
     new LoginUserService(loginRequestEntity) 
       .setListener(
         login -> loginSuccess(login), 
         sr -> loginFail(sr)) 
       .execute(); 
    } 

private void loginSuccess(LoginResponseEntity login) { 
     //TODO loginSuccess 
    } 

private void loginFail(ServerResponse sr) { 
     //TODO loginFail 
    } 

但是Android工作室標誌着紅loginSuccess(登錄loginFail(SR作爲錯誤 並顯示消息「LoginResponseEntity不能應用於」和「ServerResponse不能應用於
因此,我不能設置的λ參數‘登錄’作爲參數傳遞給方法loginSuccess(登錄)
請幫助我瞭解什麼不對的表達。

+1

Android的編譯與Java 6 。在Java中6 – Shloim

+0

沒有lambda表達式,我知道,我用retrolambda等lambda表達式工作 –

+1

你應該提及的是,你的問題。 – Shloim

回答

3

您可以使用lambda表達式只能用Functional interfaces。這意味着您的界面必須指定只有一個方法。

要記住它(簡單地說 - 有能力使用lambda表達式而不是匿名類),最好的方法是將@FunctionalInterface註釋添加到接口中。

@FunctionalInterface 
public interface LoginUserInterface { 
    LoginResult login(...) 
} 

,然後派遣上LoginResult

+0

你不需要@FunctionalInterface註釋 –

+0

。我寫的是你需要什麼?我剛纔提到要將界面標記爲功能性,並避免將來出現錯誤 – k0ner

2

是價值,正確的答案是:「你可以使用lambda表達式只能用功能接口,這意味着你的接口有指定只有一個方法。」

對於其他誰將會爲一些解決辦法這個搜索是我的解決方案:在兩個功能接口

public interface SuccessLoginUserInterface { 
    void onLoginSuccess(LoginResponseEntity login); 
} 

public interface FailLoginUserInterface { 
    void onLoginFail(ServerResponse sr); 
} 

Devide接口和你的lambda表達式看起來很好:

private void makeLoginRequest(LoginRequestEntity loginRequestEntity) { 
    new LoginUserService(loginRequestEntity) 
      .setsListener(
        login -> loginSuccess(login), 
        sr -> loginFail(sr)) 
      .execute(); 
} 
相關問題