2015-11-02 54 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