4

我正在尝试使用retrolambda在 Android 上使用 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 Studio 将红色loginSuccess( login )loginFail( sr )标记为错误并显示消息“ LoginResponseEntity 无法应用于”和“ ServerResponse 无法应用于
所以我无法将 lambda 参数“ login ”设置为方法loginSuccess(登录)
请帮助我理解这个表达式有什么问题。

4

2 回答 2

5

您只能将 lambdas 与功能接口一起使用。这意味着您的界面只需要指定一种方法。

要记住它(简单地说 - 能够使用 lambdas 而不是匿名类),最好的方法是将@FunctionalInterface注释放在您的接口中。

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

然后发送价值LoginResult

于 2015-11-29T23:57:44.940 回答
2

是的,正确答案是“您只能将 lambdas 用于功能接口。这意味着您的接口必须只指定一种方法。”

对于其他将寻找一些解决方法的人,这是我的解决方案:在两个功能接口上定义接口

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

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

你的 lambda 表达式看起来不错:

private void makeLoginRequest(LoginRequestEntity loginRequestEntity) {
    new LoginUserService(loginRequestEntity)
            .setsListener(
                    login -> loginSuccess(login),
                    sr -> loginFail(sr))
            .execute();
}
于 2015-11-30T00:23:14.000 回答