2017-11-17 5 views
2

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 수.과 기능을 통합한다.

+0

당신은'filterByLatestFrom' 구현을 공유 할 수 (신규 가입에 마지막 값을 재생합니다 피사체를) 해결했던 것처럼 도 PublishSubject로 변경? – yosriz

+0

질문 업데이트 –

답변

2

귀하의 의사 운영자 filterByLatestFrom이 문제가 테스트 내에있는, 잘있다, PublishSubject가 방출됩니다 단지 후속 항목이므로 마지막 구독 ('결과 AC')에서 observableB은 이미 2를 내고 있으며 observableC은 이미 3을 방출했으며 observableB (merge 사용)으로 재생하지 않습니다.

observableC.onNext(3)을 마지막 구독 (마지막 줄) 이후로 이동하면 예상되는 동작이 표시됩니다.

편집 : 당신이 같은 문제

관련 문제