Java Rx - 过滤定时事件

时间:2015-11-02 07:27:30

标签: java reactive-programming rx-java

假设我的observable发出整数。我希望我的观察者在最后30秒内触发整数x,x不是由observable生成的。

行为类似于谴责但反转。

1 个答案:

答案 0 :(得分: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)
    ;
}

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