Đầu tiên, tạo một phương pháp khuyến nông helper như thế này:
fun<T, R> Observable<T>.subscribe(
receiver: R,
onSuccess: R.(T) -> Unit,
onFailure: R.(Throwable) -> Unit) {
subscribe({ receiver.onSuccess(it) }, { receiver.onFailure(it) })
}
Bây giờ bạn có thể sử dụng phương pháp mới của bạn như thế này:
AppObservable.bindActivity(this, api.get(id)).subscribe(this, ::onSuccess, ::onFailure)
Nhà điều hành ::
tạo ra một tài liệu tham khảo phương pháp. Khi KT-6947 được giải quyết, chúng tôi có thể bỏ qua phương thức trợ giúp và viết trực tiếp subscribe(this::onSuccess, this::onFailure)
. Đây là đã có thể có trong Java 8.
Để làm việc xung quanh vấn đề này, chúng ta có thể lựa chọn thực hiện phương pháp helper sau đó liên kết với một máy thu đến một phương pháp khuyến nông:
fun <T, R, E> T.bind(reference: T.(R) -> E): (R) -> E = { this.reference(it) }
và sử dụng nó như thế này:
AppObservable.bindActivity(this, api.get(id)).subscribe(bind(Foo::onSuccess), bind(Foo::onFailure))
nhưng điều này hầu như không thanh lịch hơn giải pháp ban đầu của bạn.
EDIT1:
Thy cú pháp ::onSuccess
bị cấm cho bây giờ, vì vậy bạn phải sử dụng 'Foo :: onSuccess' nơi Foo
là tên lớp của bạn.
EDIT2:
Bạn có thể có một chút vui vẻ với nhà điều hành quá tải bằng cách tuyên bố cùng một phương pháp như
operator fun <T, R, E> T.plus(reference: T.(R) -> E): (R) -> E = { this.reference(it) }
Sau đó, bạn có thể sử dụng nó như vậy:
AppObservable.bindActivity(this, api.get(id)).subscribe(this + Foo::onSuccess, this + Foo::onFailure)