盘点你项目中遇到过使用最多的代码

105 阅读2分钟

开篇先卖个关子,你们代码里面用的最多的代码工具是啥?

我先来,直接上代码

我翻了翻代码,发现竟然是下面这个工具方法,集合拆分工具类

/**
* 支持 import Java 标准库 (JDK 1.8)
*/
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
* 注意:目前 Java 代码的入口类名称必须为 Main(大小写敏感)
*/
public class Main {
   public static void main(String []args) {
    List<String> userIds = new ArrayList<>();

    for(int i =0;i<10000;i++){
      userIds.add(UUID.randomUUID().toString());
    }

    List<List<String>> listByLimit = getListByLimit(userIds, 1000);

    // TODO 循环遍历每个集合处理数据
   }

   /**
     * 通过传入的LIST,拆分成已limitSize数量的多个集合
     *
     * @param list
     * @param limitSize
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> getListByLimit(Collection<T> list, int limitSize) {
        int limit = countStep(list.size(), limitSize);
        List<List<T>> mgList = new ArrayList<>();
        Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
            mgList.add(list.stream().skip(i * limitSize).limit(limitSize).collect(Collectors.toList()));
        });

        return mgList;
    }

    /**
     * 计算需要分为几个集合
     *
     * @param totalSize
     * @param limitSize
     * @return
     */
    private static Integer countStep(Integer totalSize, Integer limitSize) {
        return (totalSize + limitSize - 1) / limitSize;
    }
}

为什么使用了这么多,都有哪些场景?

场景1 分批次查询sql

  • 为什么要用在项目代码中相信大家都知道避免不了IN多个数据的情况,那么直接IN不行么?
  • 导致的结果数据量少时还好,如果有1W以上数据需要IN呢,此时如果直接IN,那么表数据量大时会出现索引失效的情况,效率极低。
  • 分批处理建议一般情况下1K调用一次最为合理。

场景2 分批次调用接口

  • 为什么要用当数据量过大时调用接口(不论是第三方还是公司自己的接口),不分批调用对方都要骂娘了。
  • 导致的结果轻则对方屏蔽你的接口,重则对方接口直接被干挂掉
  • 分批处理建议根据业务场景不同,接口复杂度高的建议200一次调用,如果复杂度低的可以控制1000调用一次(为啥是1000,原理参考sql分批查询逻辑)

总结

  • 以上方法可以理解为是内存分页,方法不限于此,有更好的方法可以一起讨论。
  • 以上方法都是在内存中处理,如果数据量太大时慎用(达到百万千万,还是考虑数据库分页保险)。