时间统计/计时

StopWatch 任务步骤计时

出处:org.springframework.util.StopWatch
作用:统计、汇总每个步骤的用时;单机计时
官方介绍:

简单的秒表,允许为许多任务计时,公开总运行时间和每个指定任务的运行时间。 隐藏 System.currentTimeMillis() 的使用,提高了应用程序代码的可读性,减少了计算错误的可能性。 请注意,此对象不是设计为线程安全的,也不使用同步。 此类通常用于在概念验证和开发过程中验证性能,而不是作为生产应用程序的一部分。

  1. import org.apache.commons.lang3.RandomUtils;
  2. import org.springframework.util.StopWatch;
  3. import java.util.concurrent.TimeUnit;
  4. public class StopWatchTest {
  5. public static void main(String[] args) throws InterruptedException {
  6. final StopWatch sw = new StopWatch();
  7. sw.start("A");
  8. randomSleep();
  9. sw.stop();
  10. sw.start("B");
  11. randomSleep();
  12. sw.stop();
  13. sw.start("C");
  14. randomSleep();
  15. sw.stop();
  16. System.out.println(sw.prettyPrint());
  17. }
  18. private static void randomSleep() throws InterruptedException {
  19. TimeUnit.SECONDS.sleep(RandomUtils.nextInt(0, 5));
  20. }
  21. }

输出结果如下,可以看到每一个步骤的耗时、占用百分比、运行总时间

  1. StopWatch '': running time (millis) = 2015
  2. -----------------------------------------
  3. ms % Task name
  4. -----------------------------------------
  5. 00014 001% A
  6. 01000 050% B
  7. 01001 050% C

List

list 分区 partition

出处:com.google.common.collect.Lists#partition
作用:将 list 按数量分区成多个 list

  1. import com.google.common.collect.Lists;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. import java.util.stream.IntStream;
  5. public class Demo {
  6. public static void main(String[] args) {
  7. final List<Integer> ids = IntStream.range(1, 11).mapToObj(Integer::new).collect(Collectors.toList());
  8. final List<List<Integer>> partition = Lists.partition(ids, 3);
  9. System.out.println(partition);
  10. // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
  11. }
  12. }

重试机制

spring-retry
简单来说,就如同下面这样来配置一个重试调用,spirng 下面这种方式依赖 aop。由于版本问题,最新使用方式,请查看文档

  1. @Retryable(value = {RemoteServerException.class},
  2. maxAttempts = 3, // 重试次数(如果异常,总共调用三次该方法,包括异常的那一次)
  3. backoff = @Backoff(
  4. delay = 1000 * 30, // 重试间隔 30 秒
  5. maxDelay = 1000 * 50 // 最大重试间隔 50 秒
  6. ))
  7. public void test() {
  8. log.info("重试中");
  9. throw new RemoteServerException("异常");
  10. }

字符串操作

StringUtils 截取等各种处理

出处:org.apache.commons.lang3.StringUtils
作用:字符串常用操作

  1. // 拿匹配结构的后缀,返回结果 sms
  2. StringUtils.substringAfter("/code/sms", "/code/");
  3. --------------------------------------------------------------
  4. 获取匹配结果的前缀
  5. // ImageCodeProcessor 类名
  6. // 结果:Image
  7. // 使用场景:只用持有者管理所有实现子类的时候,可以拿到前缀,然后根据前缀拿到相关的枚举信息
  8. StringUtils.substringBefore(getClass().getSimpleName(), "CodeProcessor");
  9. --------------------------------------------------------------
  10. 提供类似与正则表达式的字符串截取
  11. // callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );
  12. // 返回 YOUR_OPENID
  13. StringUtils.substringBetween(str,"\"openid\":", "\"}");
  14. ---------------------------------------------------------------
  15. 替代传统多次按等号分割,但是又只想获取值的情况
  16. // access_token=FE04*******CCE2&expires_in=7776000&refresh_token=88E4*********BE14
  17. String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(responseStr, "&");
  18. String accessToken = StringUtils.substringAfterLast(items[0], "=");
  19. --------------------------------------------------------------

字符串分隔

出处:com.google.common.base.Splitter
作用:按指定字符分隔
场景:大量使用某一种分隔符时,会提高性能

  1. // com.google.common.base.Splitter
  2. Splitter splitter = Splitter.on("#");
  3. List<String> strings = splitter.splitToList("12345#789");
  4. // [12345, 789]
  5. System.out.println(strings);

JSON 操作

  • JSONPath 按路径操作 JSON

    方法参数校验

    快捷的工具类、类似断言检查

    出处:com.google.common.base.Preconditions
    作用:帮助方法或构造函数检查它是否被正确调用(是否满足其前提条件)的静态工具类
  1. // 如果 topic 为 null 就抛出空指针异常
  2. Preconditions.checkNotNull(message.getTopic());