Lambda表达式 - 不能将lambda参数设置为方法的参数

时间:2015-11-29 23:52:18

标签: java android lambda retrolambda

我尝试使用 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(登录 loginFail( sr 标记为错误 并显示消息" LoginResponseEntity无法应用于"和" ServerResponse无法应用于"
所以我不能设置lambda参数' 登录'作为方法的参数 loginSuccess(登录) 请帮助我理解这个表达的错误。

2 个答案:

答案 0 :(得分:4)

您只能将{lambdas}与Functional interfaces一起使用。这意味着您的界面必须仅指定一个方法。

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

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

然后调度LoginResult

的值

答案 1 :(得分:2)

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

对于其他将搜索某些解决方法的人来说,这是我的解决方案: 两个功能接口上的Devide接口

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();
}