2017-07-28 2 views
1

J'ai un tampon courant, en attente d'une quantité prédéterminée de temps de silence, avant de publier une liste d'éléments qui ont été tamponné:Comment mettre à l'échelle de manière dynamique le rebond du flux d'émission de salve?

INTEGERS 
    .share() 
    .buffer(INTEGERS.debounce(DEBOUNCE_TIME,TimeUnit.MILLISECONDS,scheduler)) 
    .map { durations -> 
     ... 
    } 

Je voudrais faire DEBOUNCE_TIME ajuster dynamiquement en fonction de la moyenne des objets tamponnés, mais j'ai du mal à comprendre comment y parvenir.

Répondre

1

Vous pouvez reporter l'anti-rebond, prendre un élément de celui-ci et répéter de déclenchement une fois que la nouvelle valeur anti-rebond a été déterminée:

int DEBOUNCE_TIME = 100; 
AtomicInteger debounceTime = new AtomicInteger(DEBOUNCE_TIME); 
PublishSubject<Integer> mayRepeat = PublishSubject.create(); 

AtomicInteger counter = new AtomicInteger(); 

Observable<Integer> INTEGERS = 
     Observable.fromArray(10, 20, 200, 250, 300, 550, 600, 650, 700, 1200) 
     .flatMap(v -> Observable.timer(v, TimeUnit.MILLISECONDS) 
       .map(w -> counter.incrementAndGet())); 

INTEGERS.publish(o -> 
     o.buffer(
      Observable.defer(() -> 
       o.debounce(
        debounceTime.get(), TimeUnit.MILLISECONDS) 
      ) 
      .take(1) 
      .repeatWhen(v -> v.zipWith(mayRepeat, (a, b) -> b)) 
     ) 
    ) 
    .map(list -> { 
     int nextDebounce = Math.min(100, list.size() * 100); 
     debounceTime.set(nextDebounce); 
     mayRepeat.onNext(1); 
     return list; 
    }) 
    .blockingSubscribe(System.out::println); 

Cette impression:

[1, 2] 
[3, 4, 5] 
[6, 7, 8, 9] 
[10] 
+0

Après la mise en œuvre dans mon projet, Je dois dire que c'est vraiment cool et fonctionne vraiment bien. Une fois que j'ai commencé à écrire quelques tests, cela m'a aidé à déterminer que le cœur de ce que j'essaie d'accomplir n'est pas vraiment faisable en raison des contraintes de l'ensemble de données. Je suis en fait un peu triste, je n'ai plus de cas d'utilisation pour justifier, y compris ce petit motif soigné. Merci de prendre le temps de répondre! :) – saganaut