【问题标题】:Call Higher Order function of Kotlin from Java从 Java 调用 Kotlin 的高阶函数
【发布时间】:2018-11-02 17:22:11
【问题描述】:

Kotin 类

class LoginService{

    fun getLoginData(loginData: String) {
        request(LoginApi.create().getLoginData(loginData))}
    }

    fun changePassword(_:String){
        request(LoginApi.create().changePassword(_)
    }

    class RequestData {
        var retrofitCall: ((String) -> Unit)? = null
    }
}

Java 类

class LoginModel{

    private void loginData(){
        RequestData data = new RequestData();
        requestData.setRetrofitCall(username ->LoginService::getLoginData)
    }

    private void changePassword(){
        RequestData data = new RequestData();
        requestData.setRetrofitCall(username ->LoginService::changePassword)
     }
 }

requestData.setRetrofitCall(username ->LoginService::changePassword)

为什么要使用高阶函数

由于我必须区分调用函数的每个 API 调用与其特性,因此尝试使用。

如何调用上面高亮的代码?

【问题讨论】:

  • 那是对 lambda 的错误使用。 username -> 表示“这是一个新函数”,这意味着您不能在那里传递函数引用。只需使用setRetrofitCall(LoginService::changePassword)
  • 我是否需要升级到 Java 1.8 才能做到这一点?
  • 你需要 Java 1.8 才能使用 Java lambda,是的。
  • 我不想那样做,有没有其他办法?
  • 你可以使用retrolambda。但是您可以升级到 Java 8,而不会在平台上造成任何明显损失。 Java 8 基础语言功能适用于所有平台。

标签: java android kotlin higher-order-functions kotlin-function-type


【解决方案1】:

在 Java 中使用 Kotlin 函数式接口有点棘手,而且不是很干净。

您的setRetrofitCall() 需要如下所示:

setRetrofitCall(new Function1<String, Unit>() {
        @Override
        public Unit invoke(String s) {
            LoginService.getLoginData(s); //I'm pretty sure LoginService is supposed to be static?
            return Unit.INSTANCE;
        }
    }
);

【讨论】:

    【解决方案2】:

    更多带有Lamda表达式的短代码

    setRetrofitCall(s -> {
            LoginService.getLoginData(s); 
                return Unit.INSTANCE;
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多