gpt4 book ai didi

Java Rx - 过滤定时事件

转载 作者:行者123 更新时间:2023-11-30 07:49:27 25 4
gpt4 key购买 nike

假设我的可观察值发出整数。如果在过去 30 秒内 x 不是由 observable 生成的,我希望我的观察者触发整数 x。

行为与谴责类似,但相反。

最佳答案

也许这不是更优雅和简洁的解决方案,但我认为您可以使用如下所示的过滤器

这个解决方案并不完美,因为 : 由发射器触发,因此要按预期工作,您必须在 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() 更可靠,如果您运行 Android 也可以使用 SystemClock.elapsedRealtime() code> 返回毫秒。 ;

关于Java Rx - 过滤定时事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33472633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com