У меня есть пример кода Java, использующий ссылку на метод, который я хочу переписать на Kotlin. Версия Java использует ссылку на метод, решение краткое и ясное. Но с другой стороны, я не могу использовать ссылку на метод в Котлине. Единственная версия, которую мне удалось написать, представлена ниже. Кажется, что Function3 { s: String, b: Boolean, i: Int -> combine(s, b, i) }
можно было бы написать более чистым способом (если возможно, ссылка на метод была бы идеальной).
Я новичок в Котлине, поэтому буду благодарен за любые подсказки.
Java
import io.reactivex.Observable;
public class TestJava {
Observable<String> strings() {
return Observable.just("test");
}
Observable<Boolean> booleans() {
return Observable.just(true);
}
Observable<Integer> integers() {
return Observable.just(1);
}
void test() {
Observable.combineLatest(strings(), booleans(), integers(),
this::combine);
}
double combine(String s, boolean b, int i) {
return 1.0;
}
}
Котлин
import io.reactivex.Observable
import io.reactivex.functions.Function3
class TestKotlin {
fun strings(): Observable<String> {
return Observable.just("test")
}
fun booleans(): Observable<Boolean> {
return Observable.just(true)
}
fun integers(): Observable<Int> {
return Observable.just(1)
}
fun test() {
Observable.combineLatest(strings(), booleans(), integers(),
Function3 { s: String, b: Boolean, i: Int -> combine(s, b, i) })
}
fun combine(s: String, b: Boolean, i: Int): Double {
return 1.0
}
}
ИЗМЕНИТЬ
Следующие ссылки на методы в Kotlin выдают ошибку.
fun test() {
Observable.combineLatest(strings(), booleans(), integers(), this::combine)
}
fun test() {
Observable.combineLatest(strings(), booleans(), integers(), TestKotlin::combine)
}
Ни одна из следующих функций не может быть вызвана с указанными аргументами: @CheckReturnValue @SchedulerSupport public final fun combLatest (p0: ((Observer) -> Unit) !, p1: ((Observer) -> Unit) !, p2: (( Наблюдатель) -> Единица) !, p3: ((???, ???, ???) -> ???)!): Наблюдаемый ‹(??? .. ???)>! определено в io.reactivex.Observable @CheckReturnValue @SchedulerSupport public open fun combLatest (p0: ObservableSource !, p1: ObservableSource !, p2: ObservableSource !, p3: io.reactivex.functions.Function3!): Observable ‹(???. . ???)>! определено в io.reactivex.Observable @CheckReturnValue @SchedulerSupport public open fun combLatest (p0: Function !, out (??? .. ???)> !, p1: Int, vararg p2: ObservableSource!): Observable ‹(? ?? .. ???)>! определено в io.reactivex.Observable
ИЗМЕНИТЬ 2
RxKotlin решает проблему, упомянутую в ответе.
import io.reactivex.rxkotlin.Observables
class TestKotlin {
fun test() {
Observables.combineLatest(strings(), booleans(), integers(), this::combine)
}
}
combineLatest(strings(), booleans(), integers(), this::combine)
в Котлине? - person holi-java   schedule 15.07.2017combineLatest
метода, он не знает, куда идти. это не проблема ссылочной функции. - person holi-java   schedule 15.07.2017