2015-07-01 19 views
5

Tôi đang cố gắng sử dụng Kotlin M12 trong dự án android và trong công việc tôi có đoạn mã này đăng ký ({onSuccess (nó)}, {onFailure (nó)})Làm thế nào để cải thiện cú pháp lambda kotlin?

AppObservable.bindActivity(this, api.get(id)).subscribe({onSuccess(it)}, {onFailure(it)}) 

fun onSuccess(str: String) {} 

fun onFailure(tr: Throwable) {} 

Đây là không quá tệ, nhưng tôi nghĩ nó sẽ tốt hơn. Làm thế nào tôi có thể cải thiện nó?

Trả lời

6

Đầ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) 
Các vấn đề liên quan