Java代码片段,记录一些开发时常用的代码片段。
1.保留N位小数,末尾不足补0
String resultStr = new BigDecimal("123455.7").setScale(3, BigDecimal.ROUND_HALF_UP).toString();
setScale(N, BigDecimal.ROUND_HALF_UP) :四舍五入保留N位小数,位数不足补0
2.保留N位小数,末尾不足不补0
String resultStr = new BigDecimal("123455.7").setScale(3, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString();
.setScale(N, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString(); 四舍五入保留N位小数,位数不足不补0
3.计算耗时
(double)(System.currentTimeMillis() - beginTime)/1000
beginTime: 开始时间
4.正则表达式截取字符串:
String text = "Field 'goodsMainPic' is mandatory but no value was provided.";
Pattern pattern = Pattern.compile("\\'(.*?)\\'" ); //字符串正则:截取两个 ' 直接的内容
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(0)); //截取内容包含左右两边的 '
System.out.println(matcher.group(1)); //截取内容不包含左右两边的 '
}
5.List<Bean> 转 List<Map>
List<Map> propertys = JSON.parseObject(JSON.toJSONString(List<Bean>), List.class);
6.List<Long/Bean等> 转 List<Object>
List<Object> objectList = new ArrayList<>();
List<String> stringList = new ArrayList<>();
stringList.add("qwe");
stringList.add("123");
objectList = (List<Object>) (List)stringList;
7.解决FastJson 循环引用问题 (.$ref.)
JSON.toJSONString(JsonObject, SerializerFeature.DisableCircularReferenceDetect);
toJSONString 方法增加序列号参数 SerializerFeature.DisableCircularReferenceDetect
8. Spring 读取resource中的文件
String fileName = "xxx模板.xlsx";
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template" + File.separatorChar + fileName);
9. 解决 Response 下载文件时,中文名称乱码问题
String fileName =""; //下载后的文件名称
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=utf-8''" + encodedFileName);
10. 代码处理中起新线程处理业务(单例,只有当前线程有空时才会执行)
//设置子线程共享,防止在新线程中使用 HttpServletRequest 时报错
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(sra, true);
//开启新线程执行采集远程数据
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> {
//业务代码
})
11.简单的字符串脱敏(打*号)
/**
* 字符串脱敏(使用*号简单处理)
*
* 无需设置脱敏位置,方法根据传入字符串长度,自动处理;
* 方法根据中位数原则,动态进行*号脱敏处理,字符串脱敏前后位数不变
*
* @param source
* @return
*/
public static String stringEncry(String source) {
if (StringUtils.isEmpty(source)) {
return source;
} else if (source.length() == 1) {
return "*";
} else {
int encryBit = source.length() / 2; //需脱敏位数
int start = (source.length() - encryBit) / 2; //脱敏处理起始位置
StringBuffer encryStrBuffer = new StringBuffer();
String beginStr = source.substring(0, start); //保留原字符串开始部分
encryStrBuffer.append(beginStr);
for (int i = 0; i < encryBit; i++) {
encryStrBuffer.append("*");
}
encryStrBuffer.append(source.substring(start + encryBit)); //保留原字符串结尾部分
System.out.println(">>> 源字符串:" + source + " >>> 脱敏后:" + encryStrBuffer.toString());
return encryStrBuffer.toString();
}
}
12.向上取整
new BigDecimal(1).divide(new BigDecimal(1000, 0, BigDecimal.ROUND_UP).intValue();