首页 > 其他分享 >好用的工具类(长期更新)

好用的工具类(长期更新)

时间:2024-02-23 16:22:30浏览次数:20  
标签:String List param public util 更新 import 工具 好用

1、笛卡尔积工具
记不得参考谁的了,原文不贴了
入参结构List<List>

实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author zionchen
 * @date 2023/9/25 11:39
 */
public class DescartesUtil {

    /**
     * n个list 元素笛卡尔积
     * @param list
     * @return
     * @param <T>
     */
    public static <T> List<List<T>> getDescartes(List<List<T>> list) {
        List<List<T>> returnList = new ArrayList<>();
        descartesRecursive(list, 0, returnList, new ArrayList<T>());
        return returnList;
    }

    /**
     * 递归实现
     * 原理:从原始list的0开始依次遍历到最后
     *
     * @param originalList 原始list
     * @param position     当前递归在原始list的position
     * @param returnList   返回结果
     * @param cacheList    临时保存的list
     */
    private static <T> void descartesRecursive(List<List<T>> originalList, int position, List<List<T>> returnList, List<T> cacheList) {
        List<T> originalItemList = originalList.get(position);
        for (int i = 0; i < originalItemList.size(); i++) {
            //最后一个复用cacheList
            List<T> childCacheList = (i == originalItemList.size() - 1) ? cacheList : new ArrayList<>(cacheList);
            childCacheList.add(originalItemList.get(i));
            if (position == originalList.size() - 1) {
                //遍历到最后退出递归
                returnList.add(childCacheList);
                continue;
            }
            descartesRecursive(originalList, position + 1, returnList, childCacheList);
        }
    }

    public static void main(String[] args) {
        List<List<String>> listData = new ArrayList<>();
        listData.add(Arrays.asList("A1", "B1"));
        listData.add(Arrays.asList("A2", "B2"));
        listData.add(Arrays.asList("A3", "B3"));
//        listData.add(Arrays.asList("A4", "B4"));
        List<List<String>> lisReturn = getDescartes(listData);
        System.out.println(lisReturn);
        System.out.println(lisReturn.size());
    }

}

2、mybatis批量插入

基础类
public interface StatusEnum {
    String getCode();
    String getDesc();
}


public enum ErrorCodeEnum implements StatusEnum {
  BASH_INSERT_ERROR("10004","mybatis批量入库出错");
  private String code;

  private String desc;

  ErrorCodeEnum(String code,String desc){
      this.code = code;
      this.desc = desc;
  }

  @Override
  public String getCode() {
      return code;
  }

  @Override
  public String getDesc() {
      return desc;
  }
}

实现
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import javax.annotation.Resource;
import java.util.List;
import java.util.function.BiFunction;

/**
 * @author zionchen
 * @date 2023/8/25 16:08
 */
@Component
public class MybatisBatchUtils {

    /**
     * 每次处理1000条
     */
    private static final int BATCH_SIZE = 1000;

    @Resource
    private SqlSessionFactory sqlSessionFactory;

    /**
     * 批量处理修改或者插入
     * 使用方式   batchUtils.batchUpdateOrInsert(数据集合, item -> mapper实例对象.insert方法(item));
     *
     * @param data        需要被处理的数据
     * @param mapperClass Mybatis的Mapper类
     * @param function    自定义处理逻辑
     * @return int 影响的总行数
     */
    public <T, U, R> int batchUpdateOrInsert(List<T> data, Class<U> mapperClass, BiFunction<T, U, R> function) {
        int i = 1;
        SqlSession batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        try {
            // 开启事务
            batchSqlSession.getConnection().setAutoCommit(false);
            U mapper = batchSqlSession.getMapper(mapperClass);
            int size = data.size();
            for (T element : data) {
                function.apply(element, mapper);
                if ((i % BATCH_SIZE == 0) || i == size) {
                    batchSqlSession.flushStatements();
                }
                i++;
            }
            // 非事务环境下强制commit,事务情况下该commit相当于无效
            batchSqlSession.commit(!TransactionSynchronizationManager.isSynchronizationActive());
        } catch (Exception e) {
            batchSqlSession.rollback();
            throw new AppException(ErrorCodeEnum.BASH_INSERT_ERROR);
        } finally {
            batchSqlSession.close();
        }
        return i - 1;
    }
}

应用
    @Resource
    private MybatisBatchUtils mybatisBatchUtils;

    mybatisBatchUtils.batchUpdateOrInsert(testEntity, TestMapper.class, (e, testTempMapper) -> testMapper.insert(e));

3、map合并
将2个map合并,重复的key使用map1的

点击查看代码
import java.util.Map;
import java.util.function.BinaryOperator;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * map合并工具
 *
 * @author zionchen
 * @date 2023/11/2 16:20
 */
public class MergeMapUtil {

    /**
     * 合并 两个map  有重复key时应用 map1的值
     * @param map1
     * @param map2
     * @return
     * @param <K>
     * @param <V>
     */
    public static <K, V> Map<K, V> mergeMaps(Map<K, V> map1, Map<K, V> map2) {
        BinaryOperator<V> mergeFunction = (v1, v2) -> v1;
        return Stream.of(map1, map2)
                .flatMap(map -> map.entrySet().stream())
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, mergeFunction));
    }
}

标签:String,List,param,public,util,更新,import,工具,好用
From: https://www.cnblogs.com/zionchen/p/18029825

相关文章

  • powershell 制作工具菜单
    functionmainMenu{$mainMenu='X'while($mainMenu-ne''){Clear-HostWrite-Host"`n`t`tMyScript`n"Write-Host-ForegroundColorCyan"MainMenu"Write-Host-ForegroundColo......
  • ffmpeg 工具及命令介绍
    ffprobe工具介绍查看帮助信息:ffprobe--help使用方式:ffprobe[OPTIONS][INPUT_FILE]查看多媒体数据包:ffprobe-show_packetsoutput.mp4ffprobe-show_packets-show_dataoutput.mp4查看封装格式:ffprobe-show_formatoutput.mp4查看视频文件的帧信息:ffprobe-sh......
  • 标尺工具
    思路使用样条线和文本渲染组件进行制作演示步骤1.修改样条线类型2.创建文本框3.编写逻辑......
  • 计时器工具
    思路制作一个计时器蓝图,放到关卡中实例化后使用关卡蓝图调用展示步骤1.计时器蓝图2.关卡蓝图调用......
  • 随机旋转岩石工具
    思路:制作一个石头模型并对其碰撞进行自动凸包,放入蓝图中,通过蓝图中的构造脚本进行随机旋转,即可实现石块放置时的旋转效果;演示操作1.创建石头模型使用BSP工具进行顶点编辑添加材质后转成静态网格体对模型进行自动凸包碰撞2.蓝图中控制石块的随机旋转和缩放为了方便控制缩......
  • 让 K8s 更简单!8款你不得不知的 AI 工具-Part 2
    在part1中,我们探讨了目前比较流行的四种OpenAI开源工具。在今天的part2中我们将探究另外三种不同的OpenAI开源工具并介绍一些与Appilot相关的内容。 Kubectl-GPTKubectl-GPT是一个kubectl插件,可使用GPT模型从自然语言输入生成kubectl命令。该插件引入了ku......
  • 盘点几款好用的测试工具
    俗话说,工欲善其事必先利其器。要做出高效的测试当然离不开工具,有了工具如鱼得水。下面介绍几款好用的软件测试常用的工具:1.Loadrunner——性能测试工具:是一种预测系统行为和性能的[负载]测试工具。通过模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunn......
  • 袋鼠云产品功能更新报告09期|更全面,更多样,更高效
    欢迎阅读袋鼠云09期产品功能更新报告。在此期报告中,我们秉持创新与优化并重的理念,对产品进行了深度打磨与全面升级。每一处细节的改进,都是我们对卓越品质的不懈追求,期待这些新功能能助力您的业务运营与发展,让数字化转型之路更加畅通无阻。以下为袋鼠云产品功能更新报告09期内容,更......
  • 持续集成工具Jenkins
    1从装修厨房看项目开发效率优化1.1持续部署装修厨房全部装好之后发现灯不亮,电路有问题;冷热水装反了,管路有问题。这些问题要解决就必须把地砖、墙砖拆掉——一个环节有问题,其他环节跟着返工。那怎么做会好一些呢?任何安装完成及时测试,确保其可以正常工作。项目......
  • DDR不同代技术更新
    DDR(DoubleDataRateSynchronousDynamicRandomAccessMemory),意为双倍速率同步动态随机存储器,是在SDRAM基础上发展而来的存储器。DDR分为DDR1、DDR2、DDR3、DDR4、DDR5。代数年份速率(MT/s)容量预取位数电压(V)DDR12000200~40064Mb~1Gb2n......