【代码块】1、借助LinkedHashMap解决重复代码问题

博客探讨了如何借助Java中的LinkedHashMap数据结构解决代码重复问题。在需求描述中,提出了一个定时调用任务的场景,初期每10秒调用,之后变为每分钟调用。文章对比了两种解决方案:简单的双重循环和使用LinkedHashMap。方案二通过将执行次数作为key,对应休眠时间作为value,实现了代码的复用和拓展性。实际效果验证了这种方法的有效性。

需求描述

  • 前5分钟,每10s 调用一次,后5分钟,每分钟调用一次(需求可继续拓展)

需求分析

  • 方案一:采用两个for循环就能实现
    • 优点:实现简单
    • 缺点:代码容易出现冗余,后期不方便拓展
  • 方案二:借助数据结构LinkedHashMap来存储,key是执行次数,value是该次数对应的休眠时间;前30次是10s,从第30次到第35次是1分钟;
    • 优点:复用代码,代码简洁,后期方便拓展

代码实现

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

public class QueryFrequency {

    /**
     * key是执行次数,value是该次数对应的休眠时间
     * 前30次是休眠10s,从第30次到第35次是休眠1分钟
     */
    private final static Map<Integer, Long> FREQUENCY_MAP = Collections.unmodifiableMap(
            new LinkedHashMap<Integer, Long>() {
                {
                    this.put(30, 10 * 1000L);
                    this.put(30 + 5, 60 * 1000L);
                    // 后期拓展
                }
            });

    public static void main(String[] args) throws Exception {
        // 先获取需要执行的总次数,即key最大值
        Integer total = FREQUENCY_MAP.keySet()
                .stream()
                .max(Integer::compareTo)
                .orElseThrow(() -> new Exception("not key."));
        for (int i = 0; i < total; i++) {
            // TODO 通用业务处理逻辑
            // 休眠
            Long millis = getSleepMillis(i);
            System.out.println(i + " ==> " + millis);
            sleep(millis);
        }
    }

    private static Long getSleepMillis(int i) throws Exception {
        return FREQUENCY_MAP.entrySet()
                .stream()
                .filter(entry -> entry.getKey() > i)
                .findFirst()
                .map(Map.Entry::getValue)
                .orElseThrow(() -> new Exception("not value."));
    }

    private static void sleep(Long millis) throws InterruptedException {
        Thread.sleep(millis);
    }
}
效果展示
  • 效果如下,符合预期
0 ==> 10000
1 ==> 10000
......
28 ==> 10000
29 ==> 10000
30 ==> 60000
31 ==> 60000
32 ==> 60000
33 ==> 60000
34 ==> 60000

总结

  • 合理利用数据结构能够优化代码结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值