Как улучшить синтаксис лямбда kotlin?

Я пытаюсь использовать kotlin M12 в проекте Android, и во время работы я получил эту часть кода ({onSuccess (it)}, {onFailure (it)})

AppObservable.bindActivity(this, api.get(id)).subscribe({onSuccess(it)}, {onFailure(it)}) fun onSuccess(str: String) {} fun onFailure(tr: Throwable) {} 

Это не так плохо, но я думаю, что это будет / должно быть лучше. Как я могу улучшить его?

Во-первых, создайте вспомогательный метод расширения следующим образом:

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

Теперь вы можете использовать свой новый метод следующим образом:

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

Оператор ::: создает ссылку на метод. Как только KT-6947 будет разрешен, мы можем опустить вспомогательный метод и написать subscribe(this::onSuccess, this::onFailure) напрямую. Это уже возможно в Java 8.

Чтобы обойти эту проблему, мы можем альтернативно реализовать следующий вспомогательный метод, который привязывает приемник к методу расширения:

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

и используйте его так:

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

но это вряд ли более элегантно, чем ваше первоначальное решение.

EDIT1:

Твой синтаксис ::onSuccess теперь запрещен, поэтому вам нужно использовать «Foo :: onSuccess», где Foo – ваше имя класса.

EDIT2:

Вы можете немного повеселиться с перегрузкой оператора, объявив тот же метод, что и

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

Затем вы можете использовать его так:

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