2015-07-01 36 views
5

Ben robot projesinde M12 KOTLIN kullanmaya çalışıyorum ve çalışma sırasında kod bu parça abone var ({onSuccess (it)}, {onFailure (o)})nasıl KOTLIN lambda sözdizimi artırmak için?

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

fun onSuccess(str: String) {} 

fun onFailure(tr: Throwable) {} 

budur o kadar kötü değil, ama/iyi olmalıdır diye düşünüyorum. Bunu nasıl geliştirebilirim?

cevap

6

Birincisi, böyle bir yardımcı uzantısı yöntemi oluşturmak:

fun<T, R> Observable<T>.subscribe(
     receiver: R, 
     onSuccess: R.(T) -> Unit, 
     onFailure: R.(Throwable) -> Unit) { 
    subscribe({ receiver.onSuccess(it) }, { receiver.onFailure(it) }) 
} 

Şimdi böyle yeni yöntemi kullanabilirsiniz:

AppObservable.bindActivity(this, api.get(id)).subscribe(this, ::onSuccess, ::onFailure) 

:: operatör bir yöntemdir referans oluşturur. KT-6947 çözüme kavuşturulacağını sonra, yardımcı yöntem ihmal ve doğrudan subscribe(this::onSuccess, this::onFailure) yazabilir.

fun <T, R, E> T.bind(reference: T.(R) -> E): (R) -> E = { this.reference(it) } 

ve bu gibi kullanmak:

Bu bizim alternatif bir uzantısı yöntemine bir alıcı bağlayan aşağıdaki yardımcı yöntemi uygulayabilir Bu soruna geçici bir çözüm için Java 8.

zaten mümkün

AppObservable.bindActivity(this, api.get(id)).subscribe(bind(Foo::onSuccess), bind(Foo::onFailure)) 

ama bu pek daha şık başlangıçtaki çözümüne kıyasla.

Edit1: Eğer Foo sınıf adıdır 'Foo :: onSuccess' kullanmak zorunda

Thy sözdizimi ::onSuccess şimdilik yasaktır.

EDIT2:

Sen Sonra

operator fun <T, R, E> T.plus(reference: T.(R) -> E): (R) -> E = { this.reference(it) } 

aynı yöntem bildirerek operatör aşırı yüklenmesi ile biraz eğlenmek olabilir bunu gibi kullanabilirsiniz:

AppObservable.bindActivity(this, api.get(id)).subscribe(this + Foo::onSuccess, this + Foo::onFailure)