JAVA开发代码小工具集合
目录
- 前言
- 编号生成工具
- EasyExcel 工具
- 断言工具
- HTTP 工具
- 字符串 工具
- 验证码生成工具
- Excel 工具
- Class 工具
- Enum 工具
- 分页工具
- 断言工具2
- IP 地址工具
- Map 工具
前言
这些工具都是日常开发中能用到的,前后端都有,觉得好用就拿过来了…
编号生成工具
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;public class UniqueCodeGenerator {public static void main(String[] args) {// 示例调用System.out.println(generateUniqueCode("yyyyMMdd", 6)); // 20250318XXXXXXSystem.out.println(generateUniqueCode("yyyy-MM-dd", 8)); // 2025-03-18XXXXXXXXSystem.out.println(generateUniqueCode("yyyyMMddHHmmss", 4)); // 20250318123045XXXXfor(long i=0;i<100;i++){//String timestampPart = ""+(Math.random() * 10000) * (System.currentTimeMillis()/10000);//System.out.println(timestampPart);//System.out.println(generateOrderSn(i));System.out.println(generateUnionPaySn());}}/*** 生成唯一编码,格式为 日期 + 指定位数的随机数字* @param dateFormat 日期格式(如 "yyyyMMdd", "yyyy-MM-dd HH:mm:ss")* @param randomDigits 生成的随机数字位数* @return 组合后的唯一编码字符串*/public static String generateUniqueCode(String dateFormat, int randomDigits) {// 格式化当前日期String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateFormat));// 生成指定位数的随机数字String randomNumber = generateRandomNumber(randomDigits);// 拼接返回return date + randomNumber;}/*** 生成指定位数的随机数字字符串* @param length 随机数字的长度* @return 生成的随机数字字符串*/private static String generateRandomNumber(int length) {Random random = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {sb.append(random.nextInt(10)); // 生成 0-9 之间的随机数字}return sb.toString();}
/*** 获取商品编码* 商品编码规则:nanoTime(后5位)*5位随机数(10000~99999)* @return*/public static String generateProductCode(){long nanoPart = System.nanoTime() % 100000L;if(nanoPart<10000L){nanoPart+=10000L;}long randomPart = (long)(Math.random()*(90000)+10000);String code = "0"+String.valueOf((new BigDecimal(nanoPart).multiply(new BigDecimal(randomPart))));return code.substring(code.length()-10);}/*** @param id: 用户id* 生成订单编号* 订单编号规则:(10位):(年末尾*月,取后2位)+(用户ID%3.33*日取整后2位)+(timestamp*10000以内随机数,取后6位)* @return*/public static String generateOrderSn(long id){Calendar calendar = Calendar.getInstance();int year = calendar.get(Calendar.YEAR);year = year % 10;if(year == 0) year = 10;int month = calendar.get(Calendar.MONTH)+1;int yearMonth = year * month;String yearMonthPart = "0"+yearMonth;yearMonthPart = yearMonthPart.substring(yearMonthPart.length() - 2 );int day = calendar.get(Calendar.DAY_OF_MONTH);int dayNum = (int)((id % 3.33) * day);String dayPart = "0"+dayNum;dayPart = dayPart.substring(dayPart.length() - 2);String timestampPart = ""+(Math.random() * 10000) * (System.currentTimeMillis()/10000);timestampPart = timestampPart.replace(".", "").replace("E", "");timestampPart = timestampPart.substring(0,6);return yearMonthPart+dayPart+timestampPart;}/*** 生成统一支付单号* 规则:年(2)月(2)日(2)时(2)分(2)+timestamp*5位随机整数取后5位* @return*/public static String generateUnionPaySn(){Calendar calendar = Calendar.getInstance();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmm");String dateTime = dateFormat.format(calendar.getTime());dateTime = dateTime.substring(2);String timestampPart = ""+(Math.random() * 10000) * (System.currentTimeMillis()/10000);timestampPart = timestampPart.replace(".", "").replace("E", "");timestampPart = timestampPart.substring(0,5);return dateTime+timestampPart;}}
EasyExcel 工具
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.handler.WriteHandler;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import lombok.extern.slf4j.Slf4j;
import lombok.var;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;/*** @author huabin* @version 1.0.0* @createTime 2024-12-27*/
@Slf4j
public class ExcelUtil {/*** 导出Excel(不指定模板,需要自定义Excel映射字段)** @param fileName 文件名* @param data 数据* @param response 响应流* @param clazz 自定义Excel 映射类* @param writeHandlers 表头的样式策略 :LongestMatchColumnWidthStyleStrategy 最长匹配列宽样式策略 ...* @param <T> 实体类*/public static <T> void exportToExcel(String fileName, String sheetName, List<T> data, HttpServletResponse response, Class<T> clazz, WriteHandler... writeHandlers) {ServletOutputStream out = null;try {// 设置响应头response.setContentType("application/x-msdownload");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8").replaceAll("\\+", "%20"));out = response.getOutputStream();sheetName = "".equals(sheetName) ? "Sheet1" : sheetName;// 构建 EasyExcel 写入var writer = EasyExcel.write(out, clazz).autoCloseStream(true).sheet(sheetName);if (writeHandlers != null) {for (WriteHandler handler : writeHandlers) {writer.registerWriteHandler(handler);}}writer.doWrite(data);out.flush();} catch (Exception e) {log.info("导出文件:{},失败:{}", fileName, e.getMessage());sendErrorResponse(response, "导出失败");} finally {if (out != null) {try {out.close();} catch (IOException ioException) {log.error("关闭输出流失败: {}", ioException.getMessage());}}}}/*** 导出Excel文件基于模版的方式** @param fileName 文件名* @param data 数据源 模板中的映射属性名 {.property}* @param response 响应流* @param inputStream 文件输入流* @param map 自定义行 key-value* @param <T> 类*/public static <T> void exportExcelToTemplate(String fileName,List<T> data,HttpServletResponse response,InputStream inputStream,Map<String, Object> map) {ServletOutputStream out = null;try {response.reset();//设置响三件套response.setContentType("application/x-msdownload");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8").replaceAll("\\+", "%20"));out = response.getOutputStream();//写入数据ExcelWriter excelWriter = EasyExcel.write(out).withTemplate(inputStream).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();//指定列表数据配置模式-基于模板填充数据FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(map, writeSheet);// 填充集合 {.property}excelWriter.fill(data, fillConfig, writeSheet);excelWriter.finish();//关闭流out.flush();} catch (Exception e) {log.info("导出文件:{},失败:{}", fileName, e.getMessage());throw new RuntimeException("导出 Excel 文件失败");}}private static void sendErrorResponse(HttpServletResponse response, String message) {try {response.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");String errorResponse = String.format("{\"code\":-1,\"message\":\"%s\",\"data\":null}", message);response.getWriter().write(errorResponse);} catch (IOException ioException) {log.error("返回错误响应失败: {}", ioException.getMessage());}}}
断言工具
import cn.hbcs.common.constants.Constants;
import cn.hbcs.common.exception.GlobalException;import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;//断言工具
public class AssertUtil {//手机的正则表达式public static void isPhone(String phone,String message){Pattern CHINA_PATTERN_PHONE = Pattern.compile( "^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$");Matcher m = CHINA_PATTERN_PHONE.matcher(phone);if(!m.matches()){throw new GlobalException(message);}}//字符串不为空public static void isNotEmpty(String text, String message) {if (text == null || text.trim().length() == 0) {throw new GlobalException(message);}}//列表不为空public static void isNotEmpty(List list, String message) {if (list == null || list.size() == 0) {throw new GlobalException(message);}}//对象为空public static void isNull(Object obj , String message){if(obj != null){throw new GlobalException(message);}}//对象不为空public static void isNotNull(Object obj , String message){if(obj == null){throw new GlobalException(message);}}//断言为falsepublic static void isFalse(boolean isFalse , String message){if(isFalse){throw new GlobalException(message);}}//断言为falsepublic static void isTrue(boolean isTrue , String message){if(!isTrue){throw new GlobalException(message);}}//int值比较public static void isEquals(int s1,int s2 , String message){if(s1 != s2){throw new GlobalException(message);}}//是否包含public static void isIn(Integer s1,List<Integer> s2 , String message){if(!s2.contains(s1)){throw new GlobalException(message);}}//字符串比较public static void isEquals(String s1,String s2 , String message){isNotEmpty(s1, "不可为空");isNotEmpty(s2, "不可为空");if(!s1.equals(s2)){throw new GlobalException(message);}}//字符串去空格比较public static void isEqualsTrim(String s1,String s2 , String message){isNotEmpty(s1, "不可为空");isNotEmpty(s2, "不可为空");if(!s1.trim().equals(s2.trim())){throw new GlobalException(message);}}//字符串忽略大小写比较public static void isEqualsIgnoreCase(String s1,String s2 , String message){isNotEmpty(s1, "不可为空");isNotEmpty(s2, "不可为空");if(!s1.trim().equalsIgnoreCase(s2.trim())){throw new GlobalException(message);}}}public class GlobalException extends RuntimeException{public GlobalException(String message) {super(message);}
}
HTTP 工具
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;import java.util.Iterator;
import java.util.Map;
import java.util.Set;/**--------------------------------------------------------
Http工具类<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.4</version>
</dependency><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version>
</dependency>
--------------------------------------------------------**/
public class HttpUtil {/** 发送post请求* map.put("Uid" ,"xxx");* map.put("Key" ,"xxxxx");* **/public static String sendPost(String url,Map<String,String> param){//结果String result = null;try {//创建http客户端HttpClient client = new HttpClient();//创建Post请求PostMethod post = new PostMethod(url);//设置请求头//在头文件中设置转码post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//封装参数if(param != null && !param.isEmpty()){Set<String> keySet = param.keySet();//取出所有的keyIterator<String> iterator = keySet.iterator();//用来封装参数的数组NameValuePair[] data = new NameValuePair[keySet.size()];int index = 0 ;while (iterator.hasNext()){String key = iterator.next();String value = param.get(key);data[index++] = new NameValuePair(key, value);}//把数据设置到请求体post.setRequestBody(data);}//执行发送client.executeMethod(post);//得到响应结果result = new String(post.getResponseBodyAsString().getBytes("utf-8"));post.releaseConnection();}catch (Exception e){e.printStackTrace();throw new RuntimeException("网络请求失败["+e.getMessage()+"]");}return result;}}
字符串 工具
import org.springframework.util.StringUtils;import java.net.URLDecoder;
import java.util.*;/*** @author huabin* @date 2018/10/26-16:16*/
public class StrUtils {//把参数转成map 如: aa=bb&cc=xx//扩展参数public static Map<String,Object> params2Map(String passback_params){if(!StringUtils.hasLength(passback_params))return null;Map<String,Object> map = new HashMap<>();try{///aaaa=bbb&ccc=1,2if(passback_params.indexOf("&") < 0){String[] params = passback_params.split("=");map.put(params[0],params[1]);}else{String[] params = passback_params.split("&");for (String param : params) {String[] paramKeyValue = param.split("=");map.put(paramKeyValue[0],paramKeyValue[1]);}}}catch (Exception e){e.printStackTrace();}return map;}/*** 把逗号分隔的字符串转换字符串数组** @param str* @return*/public static String[] splitStr2StrArr(String str,String split) {if (str != null && !str.equals("")) {return str.split(split);}return null;}/*** 把逗号分隔字符串转换List的Long** @param str* @return*/public static List<Long> splitStr2LongArr(String str) {String[] strings = splitStr2StrArr(str,",");if (strings == null) return null;List<Long> result = new ArrayList<>();for (String string : strings) {result.add(Long.parseLong(string));}return result;}/*** 把逗号分隔字符串转换List的Long** @param str* @return*/public static List<Long> splitStr2LongArr(String str,String split) {String[] strings = splitStr2StrArr(str,split);if (strings == null) return null;List<Long> result = new ArrayList<>();for (String string : strings) {result.add(Long.parseLong(string));}return result;}public static String getRandomString(int length) {String str = "0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < length; i++) {int number = random.nextInt(10);sb.append(str.charAt(number));}return sb.toString();}public static String getComplexRandomString(int length) {String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < length; i++) {int number = random.nextInt(62);sb.append(str.charAt(number));}return sb.toString();}public static String convertPropertiesToHtml(String properties){//1:容量:6:32GB_4:样式:12:塑料壳StringBuilder sBuilder = new StringBuilder();String[] propArr = properties.split("_");for (String props : propArr) {String[] valueArr = props.split(":");sBuilder.append(valueArr[1]).append(":").append(valueArr[3]).append("<br>");}return sBuilder.toString();}}
验证码生成工具
package cn.itsource.ymcc.util;import sun.misc.BASE64Encoder;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;/*** Created by huabin* on 2018/5/11*/
public class VerifyCodeUtils {//使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";private static Random random = new Random();/*** 使用系统默认字符源生成验证码** @param verifySize 验证码长度* @return*/public static String generateVerifyCode(int verifySize) {return generateVerifyCode(verifySize, VERIFY_CODES);}/*** 使用指定源生成验证码** @param verifySize 验证码长度* @param sources 验证码字符源* @return*/public static String generateVerifyCode(int verifySize, String sources) {if (sources == null || sources.length() == 0) {sources = VERIFY_CODES;}int codesLen = sources.length();Random rand = new Random(System.currentTimeMillis());StringBuilder verifyCode = new StringBuilder(verifySize);for (int i = 0; i < verifySize; i++) {verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));}return verifyCode.toString();}/*** 输出指定验证码图片流**/public static void outputImage(int w, int h, OutputStream os, String code) throws IOException {int verifySize = code.length();BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);Random rand = new Random();Graphics2D g2 = image.createGraphics();g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);Color[] colors = new Color[5];Color[] colorSpaces = new Color[]{Color.WHITE, Color.CYAN,Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,Color.PINK, Color.YELLOW};float[] fractions = new float[colors.length];for (int i = 0; i < colors.length; i++) {colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];fractions[i] = rand.nextFloat();}Arrays.sort(fractions);g2.setColor(Color.GRAY);// 设置边框色g2.fillRect(0, 0, w, h);Color c = getRandColor(200, 250);g2.setColor(c);// 设置背景色g2.fillRect(0, 2, w, h - 4);//绘制干扰线Random random = new Random();g2.setColor(getRandColor(160, 200));// 设置线条的颜色for (int i = 0; i < 20; i++) {int x = random.nextInt(w - 1);int y = random.nextInt(h - 1);int xl = random.nextInt(6) + 1;int yl = random.nextInt(12) + 1;g2.drawLine(x, y, x + xl + 40, y + yl + 20);}// 添加噪点float yawpRate = 0.05f;// 噪声率int area = (int) (yawpRate * w * h);for (int i = 0; i < area; i++) {int x = random.nextInt(w);int y = random.nextInt(h);int rgb = getRandomIntColor();image.setRGB(x, y, rgb);}shear(g2, w, h, c);// 使图片扭曲g2.setColor(getRandColor(100, 160));int fontSize = h - 4;Font font = new Font("Algerian", Font.ITALIC, fontSize);g2.setFont(font);char[] chars = code.toCharArray();for (int i = 0; i < verifySize; i++) {AffineTransform affine = new AffineTransform();affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize / 2, h / 2);g2.setTransform(affine);g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);}g2.dispose();ImageIO.write(image, "jpg", os);}private static Color getRandColor(int fc, int bc) {if (fc > 255)fc = 255;if (bc > 255)bc = 255;int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}private static int getRandomIntColor() {int[] rgb = getRandomRgb();int color = 0;for (int c : rgb) {color = color << 8;color = color | c;}return color;}private static int[] getRandomRgb() {int[] rgb = new int[3];for (int i = 0; i < 3; i++) {rgb[i] = random.nextInt(255);}return rgb;}private static void shear(Graphics g, int w1, int h1, Color color) {shearX(g, w1, h1, color);shearY(g, w1, h1, color);}private static void shearX(Graphics g, int w1, int h1, Color color) {int period = random.nextInt(2);boolean borderGap = true;int frames = 1;int phase = random.nextInt(2);for (int i = 0; i < h1; i++) {double d = (double) (period >> 1)* Math.sin((double) i / (double) period+ (6.2831853071795862D * (double) phase)/ (double) frames);g.copyArea(0, i, w1, 1, (int) d, 0);if (borderGap) {g.setColor(color);g.drawLine((int) d, i, 0, i);g.drawLine((int) d + w1, i, w1, i);}}}private static void shearY(Graphics g, int w1, int h1, Color color) {int period = random.nextInt(40) + 10; // 50;boolean borderGap = true;int frames = 20;int phase = 7;for (int i = 0; i < w1; i++) {double d = (double) (period >> 1)* Math.sin((double) i / (double) period+ (6.2831853071795862D * (double) phase)/ (double) frames);g.copyArea(i, 0, 1, h1, 0, (int) d);if (borderGap) {g.setColor(color);g.drawLine(i, (int) d, i, 0);g.drawLine(i, (int) d + h1, i, h1);}}}/*** 获取随机验证码及其加密图片**/public static String verifyCode(int w, int h, String code) {//创建一个 BASE64编码器BASE64Encoder encoder = new BASE64Encoder();//二进制输出流,用来装图片的ByteArrayOutputStream data = new ByteArrayOutputStream();//画一个w宽,h高的图片,把code画上去,然后把图片写入 datatry {outputImage(w, h, data, code);} catch (IOException e) {e.printStackTrace();throw new RuntimeException("图验证码创建失败");}//把data(图片)进行base64编码return encoder.encode(data.toByteArray());}
}
Excel 工具
import cn.hb.ycmm.common.exception.ExcelException;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.DateUtils;
import com.google.common.base.Charsets;
import lombok.SneakyThrows;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;/*** Excel工具类** @author huabin* @apiNote https://www.yuque.com/easyexcel/doc/easyexcel*/
public class ExcelUtil {/*** 读取excel的所有sheet数据** @param excel excel文件* @return List<Object>*/public static <T> List<T> read(MultipartFile excel, Class<T> clazz) {DataListener<T> dataListener = new DataListener<>();ExcelReaderBuilder builder = getReaderBuilder(excel, dataListener, clazz);if (builder == null) {return null;}builder.doReadAll();return dataListener.getDataList();}/*** 读取excel的指定sheet数据** @param excel excel文件* @param sheetNo sheet序号(从0开始)* @return List<Object>*/public static <T> List<T> read(MultipartFile excel, int sheetNo, Class<T> clazz) {return read(excel, sheetNo, 1, clazz);}/*** 读取excel的指定sheet数据** @param excel excel文件* @param sheetNo sheet序号(从0开始)* @param headRowNumber 表头行数* @return List<Object>*/public static <T> List<T> read(MultipartFile excel, int sheetNo, int headRowNumber, Class<T> clazz) {DataListener<T> dataListener = new DataListener<>();ExcelReaderBuilder builder = getReaderBuilder(excel, dataListener, clazz);if (builder == null) {return null;}builder.sheet(sheetNo).headRowNumber(headRowNumber).doRead();return dataListener.getDataList();}/*** 读取并导入数据** @param excel excel文件* @param importer 导入逻辑类* @param <T> 泛型*/public static <T> void save(MultipartFile excel, ExcelImporter<T> importer, Class<T> clazz) {ImportListener<T> importListener = new ImportListener<>(importer);ExcelReaderBuilder builder = getReaderBuilder(excel, importListener, clazz);if (builder != null) {builder.doReadAll();}}/*** 导出excel** @param response 响应类* @param dataList 数据列表* @param clazz class类* @param <T> 泛型*/@SneakyThrowspublic static <T> void export(HttpServletResponse response, List<T> dataList, Class<T> clazz) {export(response, DateUtils.format(new Date(), DateUtils.DATE_FORMAT_14), "导出数据", dataList, clazz);}/*** 导出excel** @param response 响应类* @param fileName 文件名* @param sheetName sheet名* @param dataList 数据列表* @param clazz class类* @param <T> 泛型*/@SneakyThrowspublic static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> dataList, Class<T> clazz) {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding(Charsets.UTF_8.name());fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name());response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(dataList);}/*** 获取构建类** @param excel excel文件* @param readListener excel监听类* @return ExcelReaderBuilder*/public static <T> ExcelReaderBuilder getReaderBuilder(MultipartFile excel, ReadListener<T> readListener, Class<T> clazz) {String filename = excel.getOriginalFilename();if (StringUtils.isEmpty(filename)) {throw new ExcelException("请上传文件!");}if ((!StringUtils.endsWithIgnoreCase(filename, ".xls") && !StringUtils.endsWithIgnoreCase(filename, ".xlsx"))) {throw new ExcelException("请上传正确的excel文件!");}InputStream inputStream;try {inputStream = new BufferedInputStream(excel.getInputStream());return EasyExcel.read(inputStream, clazz, readListener);} catch (IOException e) {e.printStackTrace();}return null;}}
Class 工具
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;/*** 用于获取指定包名下的所有类名(包含jar包).<br/>* 并可设置是否遍历该包名下的子包的类名.<br/>*/
public class ClassUtils {public static List<Class<?>> getClassList(String pkgName , boolean isRecursive) {List<Class<?>> classList = new ArrayList<Class<?>>();ClassLoader loader = Thread.currentThread().getContextClassLoader();try {String strFile = pkgName.replaceAll("\\.", "/");Enumeration<URL> urls = loader.getResources(strFile);while (urls.hasMoreElements()) {URL url = urls.nextElement();if (url != null) {String protocol = url.getProtocol();String pkgPath = url.getPath();if ("file".equals(protocol)) {findClassName(classList, pkgName, pkgPath, isRecursive);} else if ("jar".equals(protocol)) {findClassName(classList, pkgName, url, isRecursive);}}}} catch (IOException e) {e.printStackTrace();}return classList;}public static void findClassName(List<Class<?>> clazzList, String pkgName, String pkgPath, boolean isRecursive) {if(clazzList == null){return;}File[] files = filterClassFiles(pkgPath);if(files != null){for (File f : files) {String fileName = f.getName();if (f.isFile()) {String clazzName = getClassName(pkgName, fileName);addClassName(clazzList, clazzName);} else {if(isRecursive){String subPkgName = pkgName +"."+ fileName;String subPkgPath = pkgPath +"/"+ fileName;findClassName(clazzList, subPkgName, subPkgPath, true);}}}}}public static void findClassName(List<Class<?>> clazzList, String pkgName, URL url, boolean isRecursive) throws IOException {JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();JarFile jarFile = jarURLConnection.getJarFile();Enumeration<JarEntry> jarEntries = jarFile.entries();while (jarEntries.hasMoreElements()) {JarEntry jarEntry = jarEntries.nextElement();String jarEntryName = jarEntry.getName(); String clazzName = jarEntryName.replace("/", ".");int endIndex = clazzName.lastIndexOf(".");String prefix = null;if (endIndex > 0) {clazzName = clazzName.substring(0, endIndex);endIndex = clazzName.lastIndexOf(".");if(endIndex > 0){prefix = clazzName.substring(0, endIndex);}}if (prefix != null && jarEntryName.endsWith(".class")) {if(prefix.equals(pkgName)){addClassName(clazzList, clazzName);} else if(isRecursive && prefix.startsWith(pkgName)){addClassName(clazzList, clazzName);}}}}private static File[] filterClassFiles(String pkgPath) {if(pkgPath == null){return null;}return new File(pkgPath).listFiles(new FileFilter() {public boolean accept(File file) {return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory();}});}private static String getClassName(String pkgName, String fileName) {int endIndex = fileName.lastIndexOf(".");String clazz = null;if (endIndex >= 0) {clazz = fileName.substring(0, endIndex);}String clazzName = null;if (clazz != null) {clazzName = pkgName + "." + clazz;}return clazzName;}private static void addClassName(List<Class<?>> clazzList, String clazzName) {if (clazzList != null && clazzName != null) {Class<?> clazz = null;try {//Thread.currentThread().getContextClassLoader()ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();clazz = Class.forName(clazzName,false,contextClassLoader);} catch (ClassNotFoundException e) {e.printStackTrace();}if (clazz != null) {clazzList.add(clazz);}}}
}
Enum 工具
需要先建立一个枚举接口,之后建立的枚举去实现这个枚举接口,在调用工具传入枚举类;
public interface Enumerator {Object value();String description();}
枚举:
import lombok.AllArgsConstructor;
import lombok.Getter;/*** 错误码*/
@Getter
@AllArgsConstructor
public enum ErrorCodeEnum implements Enumerator {SUCCESS("2000", "成功"),FAIL("2001", "失败");private final String val;private final String desc;@Overridepublic String value() {return val;}@Overridepublic String description() {return desc;}
}
枚举工具
package cn.hb.ycmm.common.utils;import cn.hb.ycmm.common.enums.Enumerator;import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Stream;/*** @version V1.0* @Title: 枚举工具类* @ClassName: EnumUtils.java* @Description:* @author: huabin* @date: 2021/6/10 22:19*/
public final class EnumUtils {private EnumUtils() {}/*** 对implement com.sany.business.qap.global.enums.Enumerator的枚举进行转换成下拉列表** @param clazz* @param <E>* @return*/public static <E extends Enum<?> & Enumerator> Map<String, String> enumToMap(Class<E> clazz) {E[] enumConstants = clazz.getEnumConstants();Map<String, String> map = new LinkedHashMap<>();for (E e : enumConstants) {map.put(e.value(), e.description());}return map;}/*** 根据value找到枚举** @param enumClazz* @param value* @param <E>* @return*/public static <E extends Enum<?> & Enumerator> Optional<E> getEnumByValue(Class<E> enumClazz, final String value) {return Stream.of(enumClazz.getEnumConstants()).filter(enumerator -> Objects.equals(enumerator.value(), value)).findAny();}/*** 根据desc找到枚举** @param enumClazz* @param desc* @param <E>* @return*/public static <E extends Enum<?> & Enumerator> Optional<E> getEnumByDesc(Class<E> enumClazz, final String desc) {return Stream.of(enumClazz.getEnumConstants()).filter(enumerator -> Objects.equals(enumerator.description(), desc)).findAny();}
}
分页工具
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.Lists;import java.util.HashMap;
import java.util.List;
import java.util.Map;public final class PageUtil {private PageUtil() {}/*** @description 集合转分页对象* @param* @return*/public static <T> IPage pageListToIPage(List<T> data, IPage page) {IPage iPage = new com.baomidou.mybatisplus.extension.plugins.pagination.Page();BeanUtil.copyProperties(page, iPage, CopyOptions.create().setIgnoreNullValue(true));iPage.setRecords(data);return iPage;}/*** 逻辑分页** @currPageNo 页面传入的页号,从一开始* @pageSize 每页记录数*/public static <T> Map<String, Object> getPagingResultMap(List<T> list, Integer currPageNo, Integer pageSize) {Map<String, Object> retMap = new HashMap<>();if (list.isEmpty()) {retMap.put("result", Lists.newArrayList());retMap.put("pageNo", 0);retMap.put("pageRowNum", 0);retMap.put("totalRowNum", 0);retMap.put("totalPageNum", 0);return retMap;}if (currPageNo <= 0) {retMap.put("result", list);retMap.put("pageNo", 0);retMap.put("pageRowNum", 0);retMap.put("totalRowNum", 0);retMap.put("totalPageNum", 0);return retMap;}int totalRowNum = list.size();int totalPageNum = (totalRowNum - 1) / pageSize + 1;int realPageNo = currPageNo;if (currPageNo > totalPageNum) {realPageNo = totalPageNum;} else if (currPageNo < 1) {realPageNo = 1;}int fromIdx = (realPageNo - 1) * pageSize;int toIdx = realPageNo * pageSize > totalRowNum ? totalRowNum : realPageNo * pageSize;List<T> result = list.subList(fromIdx, toIdx);retMap.put("result", result);retMap.put("pageNo", realPageNo);retMap.put("pageRowNum", result.size());retMap.put("totalRowNum", totalRowNum);retMap.put("totalPageNum", totalPageNum);return retMap;}}
断言工具2
需要先建立一个异常提示类
public class CommonException extends RuntimeException {public CommonException(String message) {super(message);}public CommonException(Throwable e) {super(e);}public static CommonException throwCommonException(String msg) {throw new CommonException(msg);}
}
断言工具
package cn.hb.ycmm.common.utils;import cn.hb.ycmm.common.exception.CommonException;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import java.util.stream.Collectors;/*** @author huabin* @version 1.0.0* @ClassName ValidUtils.java* @Description 参数校验工具* @createTime 2019-12-31 23:59:59*/
public class ValidUtils {//大陆电话常量验证public static final String REGEXP_PHONE_CHINA = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";//大陆电话常量验证简易public static final String REGEXP_PHONE_CHINA_EASY = "^1[0-9]{10}$";//港澳电话常量验证public static final String REGEXP_PHONE_CHINA_HK = "^(5|6|8|9)\\d{7}$";//邮箱格式常量public static final String REGEXP_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";/*** 邮箱验证*/public static boolean isEmail(String str)throws PatternSyntaxException {Pattern p = Pattern.compile(REGEXP_EMAIL);Matcher m = p.matcher(str);return m.matches();}/*** 大陆号码或香港号码均可*/public static boolean isPhone(String str)throws PatternSyntaxException {return isChinaPhoneLegal(str) || isHKPhoneLegal(str);}/*** 大陆手机号码11位数,匹配格式:前三位固定格式+后8位任意数* 此方法中前三位格式有:* 13+任意数* 15+除4的任意数* 18+除1和4的任意数* 17+除9的任意数* 147*/public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {Pattern p = Pattern.compile(REGEXP_PHONE_CHINA);Matcher m = p.matcher(str);return m.matches();}/*** 香港手机号码8位数,5|6|8|9开头+7位任意数*/public static boolean isHKPhoneLegal(String str)throws PatternSyntaxException {Pattern p = Pattern.compile(REGEXP_PHONE_CHINA_HK);Matcher m = p.matcher(str);return m.matches();}//断言对象和字符串 ,为空 ,如果为空,或者是空字符串,报错public static void isNull(Object str, String message) {//判断对象if(Objects.isNull(str)){throw CommonException.throwCommonException(message);}//判断字符串if( (str instanceof String) && StringUtils.isEmpty((CharSequence) str)){throw CommonException.throwCommonException(message);}}//断言两个int值相等public static void isEquals(int n1,int n2, String message) {if(n1 != n2){throw CommonException.throwCommonException(message);}}//断言一个对象不为空,不为空,报错,不针对Strpublic static void isNotNull(Object obj, String message) {//判断对象if(Objects.nonNull(obj)){throw CommonException.throwCommonException(message);}}//断言一个集合不为空,不为空,报错public static <T> void isNotNull(List<T> data, String message){if (CollectionUtils.isNotEmpty(data)){throw CommonException.throwCommonException(message);}}//断言一个集合为空,为空,报错public static <T> void isNull(List<T> data, String message){if (CollectionUtils.isEmpty(data)){throw CommonException.throwCommonException(message);}}//断言手机号public static void isPhone(String phone, String message) {//判断手机号格式if(!isPhone(phone)){throw CommonException.throwCommonException(message);}}//断言邮箱public static void isEmail(String email, String message) {//判断邮箱格式if(!isEmail(email)){throw CommonException.throwCommonException(message);}}//断言TRUE 是ture就运行 false报错public static void isTrue(boolean success, String message) {if(!success){throw CommonException.throwCommonException(message);}}//断言TRUE OR FALSEpublic static void booleanEquals(boolean success, boolean success2,String message) {if(success != success2){throw CommonException.throwCommonException(message);}}//断言空值public static void isEquals(String str1, String str2, String message) {isNull(str1,"比较的内容不能为空");isNull(str2,"比较的内容不能为空");if(!str1.equals(str2)){throw CommonException.throwCommonException(message);}}//忽略大小写断言空值public static void isEqualsIgnoreCase(String str1, String str2, String message) {isNull(str1,"比较的内容不能为空");isNull(str2,"比较的内容不能为空");if(!str1.equalsIgnoreCase(str2)){throw CommonException.throwCommonException(message);}}//断言集合数据(String对象)是否重复public static void isRepeatToStr(String str1,String str2,String str3,String message){if (StringUtils.isNotBlank(str1) && StringUtils.isNotBlank(str2)){if (str1.equals(str2)){throw CommonException.throwCommonException(message);}}if (StringUtils.isNotBlank(str1) && StringUtils.isNotBlank(str3)){if (str1.equals(str3)){throw CommonException.throwCommonException(message);}}if (StringUtils.isNotBlank(str2) && StringUtils.isNotBlank(str3)){if (str2.equals(str3)){throw CommonException.throwCommonException(message);}}}public static void isRepeatToStr(List<String> strings,String message){List<String> list1 = strings.stream().distinct().collect(Collectors.toList());if (list1.size() != strings.size()){throw CommonException.throwCommonException(message);}}//断言集合数据是否重复public static void isRepeat(List<Object>objects,String message){objects.forEach(object ->{if (objects.contains(object)){throw CommonException.throwCommonException(message);}});}
}
IP 地址工具
package com.axin.management.common.util;import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;/*** @author huabin* @date 2023/7/21*/public final class IpAddressUtils {private IpAddressUtils() {}/*** 获取ip地址** @return ip地址*/public static String getIpAddress() {try {return InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {throw new RuntimeException(e);}}/*** 获取mac地址** @return mac地址*/public static String getMacAddress() {//获取网卡,获取地址byte[] mac;try {mac = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getHardwareAddress();} catch (SocketException | UnknownHostException e) {throw new RuntimeException(e);}StringBuilder sb = new StringBuilder();for (int i = 0; i < mac.length; i++) {if (i != 0) {//每2位用“-”拼接sb.append("-");}// 字节转换为整数int temp = mac[i] & 0xff;String str = Integer.toHexString(temp);if (str.length() == 1) {// 十位补0sb.append("0").append(str);} else {sb.append(str);}}return sb.toString();}}
Map 工具
package com.axin.management.common.util;import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.springframework.util.CollectionUtils;import java.util.Collections;
import java.util.List;
import java.util.Map;/*** @author huabin* @date 2023/8/09*/public final class MapUtils {private MapUtils() {}/*** 默认分组大小*/private final static int DEFAULT_GROUP_SIZE = 10;/*** Map拆分 (指定数组大小)** @param maps 待分组map* @param <K> key* @param <V> value* @return 子map集合*/public static <K, V> List<Map<K, V>> mapGroup(Map<K, V> maps) {return mapGroup(maps, DEFAULT_GROUP_SIZE);}/*** Map拆分 (指定数组大小)** @param maps 待分组map* @param groupSize 每个分组的大小* @param <K> key* @param <V> value* @return 子map集合*/public static <K, V> List<Map<K, V>> mapGroup(Map<K, V> maps, int groupSize) {if (CollectionUtils.isEmpty(maps) || groupSize < 1) {return Collections.emptyList();}int mapSize = maps.size();int mapGroup = mapSize / groupSize + (mapSize % groupSize == 0 ? 0 : 1);List<Map<K, V>> results = Lists.newArrayListWithCapacity(mapGroup);if (mapSize <= groupSize) {results.add(maps);return results;}int count = 0;Map<K, V> subMap = Maps.newHashMapWithExpectedSize(groupSize);for (Map.Entry<K, V> entry : maps.entrySet()) {if (count < groupSize) {subMap.put(entry.getKey(), entry.getValue());count++;} else {results.add(subMap);subMap = Maps.newHashMapWithExpectedSize(groupSize);subMap.put(entry.getKey(), entry.getValue());count = 1;}}// 添加最后一个分组results.add(subMap);return results;}}
相关文章:
JAVA开发代码小工具集合
目录 前言编号生成工具EasyExcel 工具断言工具HTTP 工具字符串 工具验证码生成工具Excel 工具Class 工具Enum 工具分页工具断言工具2IP 地址工具Map 工具 前言 这些工具都是日常开发中能用到的,前后端都有,觉得好用就拿过来了… 编号生成工具 import j…...

利用qcustomplot绘制曲线图
本文详细介绍了qcustomplot绘制曲线图的流程,一段代码一段代码运行看效果。通过阅读本文,读者可以了解到每一项怎么用代码进行配置,进而实现自己想要的图表效果。(本文只针对曲线图) 1 最简单的图形(入门&…...

【基础算法】枚举(普通枚举、二进制枚举)
文章目录 一、普通枚举1. 铺地毯(1) 解题思路(2) 代码实现 2. 回文日期(1) 解题思路思路一:暴力枚举思路二:枚举年份思路三:枚举月日 (2) 代码实现 3. 扫雷(2) 解题思路(2) 代码实现 二、二进制枚举1. 子集(1) 解题思路(2) 代码实现 2. 费解的…...

智能对联网页小程序的仓颉之旅
#传统楹联遇上AI智能体:我的Cangjie Magic开发纪实 引言:一场跨越千年的数字对话 "云对雨,雪对风,晚照对晴空"。昨天晚上星空璀璨,当我用仓颉语言写下第一个智能对联网页小程序的Agent DSL代码时࿰…...
Go字符串切片操作详解:str1[:index]
在Go语言中,return str1[:index] 是一个字符串切片操作,它截取字符串的一部分。让我们深入解析这个操作的含义和原理: 基本语法和含义 str1:原始字符串[:index]:切片操作符str1[:index]: 起始…...
JavaScript 本地存储 (localStorage) 完全指南
文章目录 JavaScript 本地存储 (localStorage) 完全指南 🔐一、什么是 localStorage?💡二、如何使用 localStorage?🔧1. 存储数据2. 读取数据3. 删除数据4. 清空所有数据 三、存储对象和数组的技巧 🎨1. 存…...
从golang的sync.pool到linux的slab分配器
最近学习golang的时候,看到golang并发编程中有一个sync.pool,即对象池,猛地一看这不跟linux的slab分配器类似嘛,赶紧学习记录下 这里先总结下设计sync.pool和slab的目的 sync.pool 为了缓解特定类型的对象频繁创建和销毁&#x…...

Python分形几何可视化—— 复数迭代、L系统与生物分形模拟
Python分形几何可视化—— 复数迭代、L系统与生物分形模拟 本节将深入探索分形几何的奇妙世界,实现Mandelbrot集生成器和L系统分形树工具,并通过肺部血管分形案例展示分形在医学领域的应用。我们将使用Python的NumPy进行高效计算,结合Matplo…...

【超详细】英伟达Jetson Orin NX-YOLOv8配置与TensorRT测试
文章主要内容如下: 1、基础运行环境配置 2、Torch-GPU安装 3、ultralytics环境配置 4、Onnx及TensorRT导出详解 5、YOLOv8推理耗时分析 基础库版本:jetpack5.1.3, torch-gpu2.1.0, torchvision0.16.0, ultralytics8.3.146 设备的软件开发包基础信息 需…...

Go语言学习-->项目中引用第三方库方式
Go语言学习–>项目中引用第三方库方式 1 执行 go mod tidy 分析引入的依赖有没有正常放在go.mod里面 找到依赖的包会自动下载到本地 并添加在go.mod里面 执行结果: 2 执行go get XXXX(库的名字)...
Vue Fragment vs React Fragment
文章目录 前言🧩 一、概念对比:Vue Fragment vs React Fragment📦 二、使用示例对比✅ Vue 3 中使用 Fragment✅ React 中使用 Fragment 🔍 三、差异解析1. **使用方式**2. **传递属性(如 key)**3. **插槽系…...
【LRU】 (最近最少使用)
LRU (最近最少使用) 文章目录 LRU (最近最少使用)一、LRU是什么?二、实现1.常规算法2.双栈更替总结 一、LRU是什么? LRU(Least Recently Used)是一种常见的缓存淘汰策略,核心思想是 “淘汰最长时间未被使用的缓存数据…...

每日Prompt:云朵猫
提示词 仰视,城镇的天空,一片形似猫咪的云朵,用黑色的简笔画,勾勒出猫咪的形状,可爱,俏皮,极简...

AI浪潮下的IT行业:威胁、转变与共生之道
目录 前言1 AI在IT行业的具体应用场景1.1 软件开发中的AI助手1.2 运维与监控的智能化1.3 测试自动化与质量保障1.4 安全防护中的智能威胁识别 2 AI对IT从业者的实际影响2.1 工作内容的结构性变化2.2 技能结构的再平衡 3 IT从业者不可替代的能力与价值3.1 复杂系统的架构与抽象能…...

基于功能基团的3D分子生成扩散模型 - D3FG 评测
D3FG 是一个在口袋中基于功能团的3D分子生成扩散模型。与通常分子生成模型直接生成分子坐标和原子类型不同,D3FG 将分子分解为两类组成部分:官能团和连接体,然后使用扩散生成模型学习这些组成部分的类型和几何分布。 一、背景介绍 D3FG 来源…...
Python Cookbook-7.12 在 SQLite 中储存 BLOB
任务 想将 BLOB 存入一个 SQLite 数据库, 解决方案 Python的 PySQLite 扩展提供了 sqlite.encode 函数,它可帮助你在 SOLite 数据库中插入二进制串。可以基于这个函数编写一个小巧的适配器类: import sqlite,cPickle class Blob(object):自动转换二进制串def __init__(self…...

蓝耘服务器与DeepSeek的结合:引领智能化时代的新突破
🌟 嗨,我是Lethehong!🌟 🌍 立志在坚不欲说,成功在久不在速🌍 🚀 欢迎关注:👍点赞⬆️留言收藏🚀 🍀欢迎使用:小智初学…...

无人机光纤FC接口模块技术分析
运行方式 1. 信号转换:在遥控器端,模块接收来自遥控器主控板的电信号。 2.电光转换:模块内部的激光发射器将电信号转换成特定波长的光信号。 3.光纤传输:光信号通过光纤跳线传输。光纤利用全内反射原理将光信号约束在纤芯内进行…...
【LeetCode】3170. 删除星号以后字典序最小的字符串(贪心 | 优先队列)
LeetCode 3170. 删除星号以后字典序最小的字符串(中等) 题目描述解题思路java代码 题目描述 题目链接:3170. 删除星号以后字典序最小的字符串 给你一个字符串 s 。它可能包含任意数量的 * 字符。你的任务是删除所有的 * 字符。 当字符串还…...
Oracle 用户名大小写控制
Oracle 用户名大小写控制 在 Oracle 数据库中,用户名的默认大小写行为和精确控制方法如下: 一 默认用户名大小写行为 不引用的用户名:自动转换为大写 CREATE USER white IDENTIFIED BY oracle123; -- 实际创建的用户名是 "WHITE"…...

作为过来人,浅谈一下高考、考研、读博
写在前面 由于本人正在读博,标题中的三个阶段都经历过或正在经历,本意是闲聊,也算是给将要经历的读者们做个参考、排雷。本文写于2022年,时效性略有落后,不过逻辑上还是值得大家参考,若所述存在偏颇&#…...

立志成为一名优秀测试开发工程师(第十一天)—Postman动态参数/变量、文件上传、断言策略、批量执行及CSV/JSON数据驱动测试
目录 一、Postman接口关联与正则表达式应用 1.正则表达式解析 2.提取鉴权码。 二、Postman内置动态参数以及自定义动态参数 1.常见内置动态参数: 2.自定义动态参数: 3.“编辑”接口练习 三、图片上传 1.文件的上传 2.上传后内容的验证 四、po…...
Global Security Market知识点总结:主经纪商业务
在全球证券市场的复杂体系中,主经纪商业务(Prime Brokerage)占据着独特且关键的位置。这一业务为大型机构投资者提供了一系列至关重要的服务,极大地影响着金融市场的运作与发展。 一、主经纪商业务的定义 主经纪商业务是投资银行…...

算法练习-回溯
今天开始新的章节,关于算法中回溯法的练习,这部分题目的难度还是比较大的,但是十分锻炼人的思维与思考能力。 处理这类题目首先要注意几个基本点: 1.关于递归出口的设置,这是十分关键的,要避免死循环的产…...
AI代码助手需求说明书架构
AI代码助手需求说明书架构 #mermaid-svg-6dtAzH7HjD5rehlu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6dtAzH7HjD5rehlu .error-icon{fill:#552222;}#mermaid-svg-6dtAzH7HjD5rehlu .error-text{fill:#552222;s…...
PTC过流保护器件工作原理及选型方法
PTC过流保护器件 (Positive Temperature Coefficient,正温度系数热敏电阻)是一种过流保护元件,其工作原理基于电阻值随温度变化的特性。当电路正常工作时,PTC的阻值很小,电流可以顺畅通过;但当…...
RabbitMQ 在解决数据库高并发问题中的定位和核心机制
RabbitMQ 在解决数据库高并发问题中的定位和核心机制 它是间接但极其有效的解决方案,以下内容聚焦如何最大化发挥 RabbitMQ 的潜力: 一、核心机制落地强化方案 1. 精准的异步化切割 关键原则:区分 “必须同步” 和 “可异步” 操作 #merma…...
VSCode主题定制:CSS个性化你的编程世界
在今天的数字世界,编程环境已成为开发者的第二大脑,而主题正是个性化你的创意空间的关键。本文将指导你如何使用CSS自定义VSCode的主题,让你的IDE不仅功能强大,更具视觉个性。 思路分析 设计思路: 创建主色调基调和…...
Windows 下彻底删除 VsCode
彻底删除 VS Code (Visual Studio Code) 意味着不仅要卸载应用程序本身,还要删除所有相关的配置文件、用户数据、插件和缓存。这可以确保你有一个完全干净的状态,方便你重新安装或只是彻底移除它。 重要提示: 在执行以下操作之前,…...

一文带你入门Java Stream流,太强了,mysqldba面试题及答案
list.add(“世界加油”); list.add(“世界加油”); long count list.stream().distinct().count(); System.out.println(count); distinct() 方法是一个中间操作(去重),它会返回一个新的流(没有共同元素)。 Stre…...