I kotlinの拡張関数として "FilterByLatestFrom"という擬似演算子を実装しました。LatestFromで観測可能
私は、この演算子を使用して次のコードを書いた:
fun testFilterByLatestFromOperator(){
val observableA : Observable<Int> = Observable.fromArray(1,2,3,4,5,6,7,8,9,10)
val observableC : PublishSubject<Int> = PublishSubject.create()
val observableB : Observable<Int> = Observable.just(2).mergeWith(observableC)
observableB.subscribe { println("observableB onNext: $it") }
observableA
.subscribe({ println("Original : $it")})
observableA.filterByLatestFrom(observableB, BiFunction { aVal, bVal -> aVal%bVal==0 })
.subscribe({ println("Result A : $it") })
observableC.onNext(3)
observableA.filterByLatestFrom(observableB, BiFunction { aVal, bVal -> aVal%bVal==0 })
.subscribe({ println("Result AC : $it") })
}
出力は次のとおりです。
observableB onNext: 2
Original : 1
Original : 2
Original : 3
Original : 4
Original : 5
Original : 6
Original : 7
Original : 8
Original : 9
Original : 10
Result A : 2
Result A : 4
Result A : 6
Result A : 8
Result A : 10
observableB onNext: 3
Result AC : 2
Result AC : 4
Result AC : 6
Result AC : 8
Result AC : 10
私はフィルタ演算子が観察Bの最後の値に従ってobsAフィルタします それはのために働くしたいです最初のブロックですが、新しい値でOn-nextを追加しても、結果は変わりません(元の観測値と同じ最終値を使用します)。
これは(それは()を構成しても、Javaから使用するデザインはFilterByLatestFromのIMPLたです:
class FilterByLatestFrom<T,U>(private val observable: Observable<T>, private val biFunction: BiFunction<U, T, Boolean>){
fun filter() : ObservableTransformer<U,U> = ObservableTransformer {
it
.withLatestFrom(
observable,
BiFunction<U,T,Pair<U,Boolean>> {
u, t -> Pair(u,biFunction.apply(u,t))
})
.filter { it.second }
.map { it.first }
}
}
fun <T,U> Observable<U>.filterByLatestFrom(observable: Observable<T>, biFunction: BiFunction<U, T, Boolean>) : Observable<U> =
this.compose(FilterByLatestFrom(observable,biFunction).filter())
私は何をしないのです
EDIT:?私は、問題を見つけたと思います: PublishSubjectはobsCがobsB後に発することを約束するconacatしなければならない代わりにBehaviorSubjectこと。そして機能をマージする必要があります。
あなたは 'filterByLatestFrom'の実装を共有することはできますか? – yosriz
質問を更新 –