I kotlin의 확장 기능으로 "FilterByLatestFrom"이라는 의사 연산자를 구현했습니다.가장 가까운 값으로 관찰 가능
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를 추가하면 결과가 변경되지 않습니다 (원래 관찰 가능 항목과 동일한 마지막 값 사용).
이 (가() 작성과도 자바에서 사용되는 설계는 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())
내가 무엇을 놓치고
편집 : 내가 문제를 찾은 것 같아 다음 PublishSubject는 obsC가 obsB 후 방출됩니다 약속 conacat해야한다 대신 BehaviorSubject 수.과 기능을 통합한다.
당신은'filterByLatestFrom' 구현을 공유 할 수 (신규 가입에 마지막 값을 재생합니다 피사체를) 해결했던 것처럼 도
PublishSubject
로 변경? – yosriz질문 업데이트 –