从Java中调用Kotlin高阶函数

oknrviil  于 2023-01-21  发布在  Kotlin
关注(0)|答案(3)|浏览(126)

科廷班

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

请求数据.setRetrofitCall(用户名-〉登录服务::更改密码)
为什么是高阶函数

由于我必须区分每个API调用调用的功能,因此尝试使用。
如何调用上面高亮显示的代码?

hjqgdpho

hjqgdpho1#

在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;
        }
    }
);
qeeaahzv

qeeaahzv2#

带有Lamda表达式的更短代码

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

jucafojl3#

如果你想使用一个命名的类而不想引用Kotlin的接口,你可以使用::

class CallbackHandler {
  Unit invoke(String s) {
    LoginService.getLoginData(s);
    return Unit.INSTANCE;
  }
}

CallbackHandler handler = new CallbackHandler();
setRetrofitCall(handler::invoke);

否则对于匿名类,你可以使用lambda表达式来表示每个查克拉帕尼的答案。

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

相关问题