使用改造方法更具表现力的方式

我想使void enqueue(Callback<T> callback); 方法调用代码块更有表现力,下面是我通常的一个

 request.enqueue(object : Callback<MyModel> { override fun onFailure(call: Call<MyModel>?, t: Throwable?) { // } override fun onResponse(call: Call<MyModel>?, response: Response<MyModel>?) { // } }) 

而想要什么和意思是,要改变这个代码块更清洁的方式,并删除这些覆盖,对象,回调关键字,并做这样的事情:

request.enqueue({throwable, response -> })

我认为可以使用扩展和更高阶的函数来改进。 有谁知道它是如何做到的?

鉴于以下功能:

 fun <T> callback(fn: (Throwable?, Response<T>?) -> Unit): Callback<T> { return object : Callback<T> { override fun onResponse(call: Call<T>, response: retrofit2.Response<T>) = fn(null, response) override fun onFailure(call: Call<T>, t: Throwable) = fn(t, null) } } 

你可以像这样使用这个改进:

 request.enqueue(callback({ throwable, response -> response?.let { callBack.onResponse(response.body() ?: RegisterResponse()) } throwable?.let { callBack.onFailed(throwable.message!!) }) 

或者,您可以定义这个其他版本的回调:

 fun <T> callback2(success: (Response<T>) -> Unit, failure: (t: Throwable) -> Unit): Callback<T>? { return object : Callback<T> { override fun onResponse(call: Call<T>, response: retrofit2.Response<T>) = success(response) override fun onFailure(call: Call<T>, t: Throwable) = failure(t) } } 

您可以使用它作为:

 request.enqueue(callback2( { r -> callBack.onResponse(r.body()) }, { t -> callBack.onFailed(t.message) })) 

你可以做的是这个(这是Java,因为我不太了解Kotlin,但应该是非常相似的):

 public class CallbackWrapper<T> implements Callback<T> { private Wrapper<T> wrapper; public CallbackWrapper(Wrapper<T> wrapper) { this.wrapper = wrapper; } public void onFailure(Call<T> call, Throwable t) { wrapper.onResult(t, null); } public void onResponse(Call<T> call, Response<T> response) { wrapper.onResult(null, response); } public static interface Wrapper<T> { void onResult(Throwable t, Response<T> response); } } 

你可以这样使用:

 call.enqueue(new CallbackWrapper((throwable, reponse) - > {...}));