java函数防抖

简介: java函数防抖

从工作里爱了生命,就是通彻了生命最深的秘密。——纪伯伦

前段时间写了js防抖,今天朋友(无中生友)找我要java版的

来!

package com.ruben.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import java.util.Timer;
import java.util.TimerTask;
@Aspect
public class HandShakeAop {
    boolean antiShakeFlag = false;
    @Pointcut("execution(* com.ruben...*.onClick(..))||execution(* android.view..*.OnClickListener.onClick(..))")
    public void onClickPointcut() {
    }
    @Around("onClickPointcut()")
    public Object around(ProceedingJoinPoint joinPoint) {
        if (antiShakeFlag) {
            return null;
        }
        try {
            Object proceed = joinPoint.proceed();
            antiShakeFlag = true;
            new Timer().schedule(new TimerTask() {
                public void run() {
                    antiShakeFlag = false;
                }
            }, 5000);
            return proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;
    }
}

这是写在AOP里的实战,如果要精简版,就是这样

package com.ruben;
import java.util.Timer;
import java.util.TimerTask;
/**
 * @ClassName: HandShakeDemo
 * @Date: 2020/9/25 19:49
 * @Description:
 */
public class HandShakeDemo {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            System.out.println("循环第" + i + "次");
            ruben();
        }
    }
    /**
     * 标志位需要定义在函数外边
     */
    public static boolean antiShakeFlag = false;
    /**
     * 执行的函数
     */
    public static void ruben() {
        if (antiShakeFlag) {
            return;
        }
        try {
            // 执行逻辑
            System.out.println("ruben执行了");
            // 逻辑执行完毕后置为空
            antiShakeFlag = true;
            new Timer().schedule(new TimerTask() {
                public void run() {
                    antiShakeFlag = false;
                }
            }, 5000);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}

输出结果可以看到,循环正常执行,但我们的关键逻辑代码只执行了一次

无论执行多少次,在schedule()第二个参数设置的时间(毫秒值)内都只会执行一次

目录
打赏
0
相关文章
|
5月前
|
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
41 1
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
53 3
|
6月前
|
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
47 1
java基础(11)函数重载以及函数递归求和
函数计算产品使用问题之怎么配置定时触发器来调用Java函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
112 1
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
135 0
Java演进问题之Serverless应用或函数的冷启动如何解决
Java演进问题之Serverless应用或函数的冷启动如何解决
Java中ArrayList的常用函数
确切地说,`ArrayList` 提供的这些方法构成了一套强大并且灵活的工具集,可以满足各种程序设计情况中的需求。例如,通过使用 `iterator()`方法,开发者可以在不知道集合大小的情况下遍历集合中全部或部分元素;而 `sort()`方法则能够对集合中的元素进行排序。这些函数在日常的Java编程中极其常见且重要,掌握它们对于进行集合操作和数据处理来说是基础且必须的。
64 2
Java中ArrayList的常用函数

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等