从Java调用Kotlin的高阶函数

从Java调用Kotlin的高阶函数,java,android,kotlin,higher-order-functions,kotlin-function-type,Java,Android,Kotlin,Higher Order Functions,Kotlin Function Type,Kotin类 class LoginService{ fun getLoginData(loginData: String) { request(LoginApi.create().getLoginData(loginData))} } fun changePassword(_:String){ request(LoginApi.create().changePassword(_) } class RequestDat

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

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
    }
}
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.setCall(用户名->登录服务::更改密码)

为什么使用高阶函数

因为我必须区分调用函数的每个API调用和它的特性,所以我尝试使用它们


如何调用上面突出显示的代码?

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

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

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;
        }
    }
);
setcall(新函数1(){
@凌驾
公共单元调用(字符串s){
getLoginData;//我很确定LoginService应该是静态的?
返回Unit.INSTANCE;
}
}
);

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

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

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;
        }
    }
);
setcall(新函数1(){
@凌驾
公共单元调用(字符串s){
getLoginData;//我很确定LoginService应该是静态的?
返回Unit.INSTANCE;
}
}
);

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

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

使用Lamda表达式的更多简短代码

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

这是对lambda的错误使用<代码>用户名->表示“这是一个新函数”,这意味着您不能在那里传递函数引用。只需使用
setInversionCall(LoginService::changePassword)
我需要升级到Java 1.8才能做到这一点吗?您需要Java 1.8才能使用Java Lambda,是的。我不想这样做,还有其他方法吗?您可以使用Retro Lambda。但是您可以升级到Java8,而不会在平台上造成任何明显的损失。Java8基本语言特性在所有平台上都可用。这是对lambda的错误使用<代码>用户名->表示“这是一个新函数”,这意味着您不能在那里传递函数引用。只需使用
setInversionCall(LoginService::changePassword)
我需要升级到Java 1.8才能做到这一点吗?您需要Java 1.8才能使用Java Lambda,是的。我不想这样做,还有其他方法吗?您可以使用Retro Lambda。但是您可以升级到Java8,而不会在平台上造成任何明显的损失。Java 8基本语言功能在所有平台上都可用。