2015-11-02 27 views
1

假设我的observable发出整数。如果在最近30秒内x不是由observable生成的,我希望我的观察者可以使用整数x。Java Rx - 过滤定时事件

该行为类似于谴责,但倒置。

回答

1

也许这不是更优雅和简洁的解决方案,但我认为你可以使用像一个过滤器下面

这个解决方案,因为不完美:由发射器触发,以达到预期效果,你必须发出TIME后假事件刷新去年

private static class TimedFilter<T> implements Func1<T, Collection<T>>{ 

    private NavigableMap<Long,T> treeMap = new TreeMap<>(); 
    private HashMap<T,Long> indexes = new HashMap<>(); 
    private final long delta_millis; 

    public TimedFilter(long delta_millis) { 
     this.delta_millis = delta_millis; 
    } 

    @Override 
    public Collection<T> call(T x) { 

     long now_millis = System.currentTimeMillis(); 

     Long oldIndex = indexes.put(x, now_millis); 

     if(oldIndex!=null) 
      treeMap.remove(oldIndex); // throws NPE - if the specified key is null and this map uses natural ordering 

     treeMap.put(now_millis,x); 

     long then_millis = now_millis - delta_millis; 
     Collection<T> values = treeMap.headMap(then_millis).values(); 
     for (T v : values){ 
      indexes.remove(v); 
     } 

     treeMap = treeMap.tailMap(then_millis, true); 
     return values; 
    } 
} 

测试

void testFunction(){ 
    getEmitter() 
      .map(new TimedFilter<>(TIME)) 
      .flatMap(Observable::from) 
      .subscribe(System.out::print) 
    ; 
} 

更新: as @tilois建议使用System.nanoTime()更可靠,如果你运行un Android,也可以使用返回millis的SystemClock.elapsedRealtime()。 ;

+1

我觉得'nanoTime'会更适合:http://stackoverflow.com/questions/351565/system-currenttimemillis-vs-system-nanotime – tilois

+0

我用'System.currentTimeMillis()'因为据我所知是最轻的方法,即使不是单调和精确。我的时间片大约一秒左右,我认为是可以的。当然我需要非常精确的时间'nanoTime'是一种很好的选择 – miv

+0

我推荐'nanoTime'的原因并不是因为'currentTimeMillis'缺乏精确度,而是因为它是挂钟时间并且可以改变(例如夏时制)因此我不会推荐它测量_elapsed_时间。 – tilois