【问题标题】:Lambda expressions - can not set lambda parameter as argument to methodLambda 表达式 - 不能将 lambda 参数设置为方法的参数
【发布时间】:2015-11-29 23:52:17
【问题描述】:

我正在尝试使用 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(login) 的参数。
请帮助我理解这个表达式有什么问题。

【问题讨论】:

  • Android 使用 Java 6 编译。Java 6 中没有 lambda。
  • 我知道,我使用 retrolambda 和其他 lambda 表达式工作
  • 你应该在你的问题中提到这一点。
  • 如果你想在android上使用lambda表达式:zserge.com/blog/android-lambda.html

标签: java android lambda retrolambda


【解决方案1】:

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

要记住这一点(简单地说 - 能够使用 lambdas 而不是匿名类),最好将@FunctionalInterface 注解到您的接口。

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

然后在LoginResult的值上调度

【讨论】:

  • 你不需要@FunctionalInterface注解
  • 我写过你需要的吗?我刚刚提到将接口标记为功能并避免将来出现错误
【解决方案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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多