Java 防抖动函数的实现

简介: 防抖函数,就是指触发事件后在n 秒内函数只能执行一次,如果在n 秒内又触发了事件,则会重新计算函数执行时间。 简单的说,当一个动作连续触发,则只执行最后一次。

概述

目前在开发一个文档监控类工具时遇到一个问题,希望在文档编写过程中不对文档做备份,而在文档编写结束时再备份,这就需要一个防抖函数。

防抖函数,就是指触发事件后在n 秒内函数只能执行一次,如果在n 秒内又触发了事件,则会重新计算函数执行时间。 简单的说,当一个动作连续触发,则只执行最后一次。

实现

我们可以使用ScheduledExecutorService的schedule方法实现

packagenet.wenzuo.util;
importjava.util.concurrent.*;
/*** 抖动函数* 以 相同 key 在 delay 时间内如果重复调用本方法将只会调用最后一次** @author 张豪* @since 2021/7/15 15:22*/publicclassDebounce {
privatestaticfinalScheduledExecutorServiceSCHEDULE=Executors.newSingleThreadScheduledExecutor();
privatestaticfinalConcurrentHashMap<Object, Future<?>>DELAYED_MAP=newConcurrentHashMap<>();
publicstaticvoiddebounce(finalObjectkey, finalRunnablerunnable, longdelay, TimeUnitunit) {
finalFuture<?>prev=DELAYED_MAP.put(key, SCHEDULE.schedule(() -> {
try {
runnable.run();
            } finally {
DELAYED_MAP.remove(key);
            }
        }, delay, unit));
if (prev!=null) {
prev.cancel(true);
        }
    }
publicstaticvoidshutdown() {
SCHEDULE.shutdownNow();
    }
publicstaticvoidmain(String[] args) {
Debounce.debounce("1", () -> {System.out.println(11);}, 3, TimeUnit.SECONDS);
Debounce.debounce("1", () -> {System.out.println(22);}, 3, TimeUnit.SECONDS);
Debounce.debounce("1", () -> {System.out.println(33);}, 3, TimeUnit.SECONDS);
Debounce.debounce("2", () -> {System.out.println(44);}, 3, TimeUnit.SECONDS);
Debounce.debounce("2", () -> {System.out.println(44);}, 3, TimeUnit.SECONDS);
Debounce.debounce("2", () -> {System.out.println(44);}, 3, TimeUnit.SECONDS);
    }
}
相关文章
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
27 1
|
2月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
32 1
java基础(11)函数重载以及函数递归求和
|
1月前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
22 3
|
3月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
79 1
|
4月前
|
存储 Java 编译器
Java中ArrayList的常用函数
确切地说,`ArrayList` 提供的这些方法构成了一套强大并且灵活的工具集,可以满足各种程序设计情况中的需求。例如,通过使用 `iterator()`方法,开发者可以在不知道集合大小的情况下遍历集合中全部或部分元素;而 `sort()`方法则能够对集合中的元素进行排序。这些函数在日常的Java编程中极其常见且重要,掌握它们对于进行集合操作和数据处理来说是基础且必须的。
32 2
Java中ArrayList的常用函数
|
3月前
|
存储 运维 Java
函数计算产品使用问题之怎么配置定时触发器来调用Java函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
29 0
|
3月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
34 0
|
4月前
|
Rust Cloud Native Java
Java演进问题之Serverless应用或函数的冷启动如何解决
Java演进问题之Serverless应用或函数的冷启动如何解决
|
5月前
|
存储 算法 搜索推荐
Java中的数组函数库及其使用技巧
Java中的数组函数库及其使用技巧
下一篇
无影云桌面