我认为这里可能有一个名字,但我不知道。所以我的第一个问题是要知道这种技术的名称。
以下是一个示例:假设您正在网页上实施实时搜索。每次用户在搜索框中键入内容时,您都会触发新的搜索查询,并且会尽可能频繁地更新结果。 这是一个愚蠢的事情,因为你会发送比实际需要更多的查询。每2-3个字母发送一次请求或每100毫秒最多发送一次请求就足够了。
因此,一种技术是在键入键后立即执行查询,如果仍有计划但未执行的查询,请取消它们,因为它们现在已经过时了。
现在更具体地说,是否有用于解决Java问题的特定模式或库?
我必须在Swing应用程序中解决问题,并且我使用了ExecutorService,它返回了我可以取消的ScheduledFutures。问题是我必须手动为我想要“缓冲”的每个方法调用创建一个Runnable,并跟踪每个Future以取消它。
我确信我不是第一个实现这样的东西的人,所以某处必须有可重复使用的解决方案?可能是Spring中有注释和代理的东西吗?
答案 0 :(得分:12)
鉴于其他答案,并经过一些搜索,似乎确实没有图书馆可以做我想要的。
我创建了一个并将其放在GitHub上。这个问题的未来读者可能会发现它很有趣。
https://github.com/ThomasGirard/JDebounce
我认为它不是很好,但至少它有效,可以用声明的方式使用:
@Debounce(delayMilliseconds = 100)
public void debouncedMethod(int callID, DebounceTest callback) { }
答案 1 :(得分:1)
您需要的是debouncing。您应该检查jQuery Throttle/Debounce plugin(除了使用相同的命名空间之外,它完全独立于jQuery)。您需要的内容由debounce part:
涵盖使用jQuery油门/去抖动,您可以传递延迟和功能
$.debounce
获取一个新函数,当重复调用时, 执行原始功能只需一次每“一堆”通话, 有效地将多个顺序调用合并为一个 在开头或结尾执行。
Underscore.js使用相同的方法:
_.debounce(function, wait, [immediate])
创建并返回传递函数的新去抖版本 这会将其执行推迟到
wait
毫秒之后 自上次调用以来经过的时间。对实施有用 只有在输入停止到达后才会发生的行为。 例如:渲染Markdown注释的预览,重新计算 窗口停止调整大小后的布局,依此类推。
// example: debounce layout calculation on window resize
var lazyLayout = _.debounce(calculateLayout, 300);
$(window).resize(lazyLayout);
[编辑]
我错误地读了“Javascript”而不是Java。之后,实际Java解决方案为written by OP。
答案 2 :(得分:1)
如果不使用像执行器和期货那样的额外基础设施,这在Java中是无法解决的。在Java中以语法简洁的方式解决这个问题是不可能的。
您将始终需要某种方法结果包装器,因为该机制立即返回,但实际结果将在以后检索。在你的情况下,这是通过Future完成的。
您将始终需要能够以允许延迟执行的方式指定要执行的代码。在大多数语言中,这是使用函数指针或函数值或闭包来完成的。在Java中,缺少这些语言特性,这通常是通过传递实现某种接口的对象来实现的,例如Runnable,Callable,它允许延迟执行代码块。还有其他选项,但没有一个是简单的,例如使用动态代理。
TL;博士
无法在Java中以简洁的方式执行此操作。