我想在最后x毫秒内发出相同的确切项目时,以防止发射出现。我已经看了节气门并调试操作员,但我不确定他们是否可以在这里帮助我。我可以使用另一个操作员,还是可以以某种方式组成它们?
您可以使用GroupByuntil进行此操作,以基本上访问单个项目
o
.groupByUntil(x => x, x => x, x => Observable.timer(1000))
.flatMap(grp => grp.first())
您可以时间戳并配对每个项目,然后检查时间和平等的边界条件。
randomSource
.timestamp()
.pairwise()
.where(pair => pair[0].timestamp - pair[1].timestamp < limit && pair[0].value === pair[1].value);
然后应用.select(pair => pair[0].value)
以恢复原始物品。
C#中的工作示例,其中一个源在随机时间内生成1到5个间隔之间的随机项目:
static IObservable<T[]> Pairwise<T>(this IObservable<T> source)
{
source = source.Publish().RefCount();
return source.Skip(1).Zip(source, (a, b) => new[] { a, b });
}
static void Main(string[] args)
{
var randomSource =
Observable.Defer(() => Observable.Timer(TimeSpan.FromSeconds(new Random().NextDouble() * 2))).Repeat().Publish().RefCount().Select(_ => new Random().Next(1, 5));
var limit = TimeSpan.FromSeconds(1);
var sameDebounce =
randomSource
.Timestamp()
.Pairwise()
.Where(pair => pair[0].Timestamp - pair[1].Timestamp < limit && pair[0].Value == pair[1].Value);
sameDebounce.Subscribe(c => Console.WriteLine("{0} {1}", c[0], c[1]));
Console.ReadLine();
}
输出:
2@9/7/2017 5:00:04 AM +00:00 2@9/7/2017 5:00:04 AM +00:00
2@9/7/2017 5:00:09 AM +00:00 2@9/7/2017 5:00:08 AM +00:00
1@9/7/2017 5:00:23 AM +00:00 1@9/7/2017 5:00:23 AM +00:00
2@9/7/2017 5:00:33 AM +00:00 2@9/7/2017 5:00:32 AM +00:00
,因为您的问题不能完全解释场景,例如将下一个发射值与最后发射值或任何最后发射值或其他内容进行比较。我会以一种通用的方法来达到解决方案。
示例在 rxjava 中。
您可以将timestamp()
与filter()
操作员一起使用,如以下内容:
ArrayList<String> list = new ArrayList<>();
final long[] timeOfSubscribe = {-1};
final long timeDuration = 2 * 1000; // 2 seconds
Observable.fromIterable(list)
.timestamp()
.filter(item -> item.time() > (timeDuration + timeOfSubscribe[0]) && item.value().equals("your last value"))
.doOnSubscribe(__ -> timeOfSubscribe[0] = Calendar.getInstance().getTimeInMillis())
.subscribe();
我想这个片段可以帮助您只需更改filter()
操作员中的发射值比较登录即可。如果您正在寻找最后发射值,则可以使用doOnNext()
操作员(以简单情况)停止最后一个发射值,或者您寻找所有需要存储列表中的发射值并检查的所有最后发射值。
我希望它有帮助。