javastring模板_Java字符串模板格式化汇总8法(附性能对
⽐)
Table of Contents
在开发过程中,经常会和字符串打交道, 其中字符串拼接的⼯作必不可少,
⽐如:
不仅还我要⽣成⼀个如此格式的路径,有什么办法?
String path= "/home/expressdelivery/${yearMonth}/${expressDeliveryType}/vipQuery_${fileName}.log";
其中的:
yearMonth
是当前⽇期的年⽉
expressDeliveryType
是物流⽅式的类型,以顺丰sf举例 ,如果是其他快递会是其他值
fileName
是当前时间的时间戳
我们来汇总下实现⽅式
1. ++
对于初学JAVA的蒙童,⼤约都会使⽤这招
@Test
public void testAdd(){
Date now = new Date();
String yearMonth = String(now, DatePattern.YEAR_AND_MONTH);
String expressDeliveryType = "sf";
String fileName = String(now, DatePattern.TIMESTAMP);
String template = "/home/expressdelivery/" + yearMonth + "/" + expressDeliveryType + "/vipQuery_" + fileName + ".log"; System.out.println(template);
故事的故事}
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723042314.log
2. StringBuffer / StringBuilder
@Test
public void testStringBuilder(){
Date now = new Date();
String yearMonth = String(now, DatePattern.YEAR_AND_MONTH);
String expressDeliveryType = "sf";
String fileName = String(now, DatePattern.TIMESTAMP);
海南环岛多少公里
StringBuilder sb = new StringBuilder();
sb.append("/home/expressdelivery/");
sb.append(yearMonth);
sb.append("/");
sb.append(expressDeliveryType);
sb.append("/vipQuery_");
sb.append(fileName);
sb.append(".log");
String template = sb.toString();1529年
System.out.println(template);
}
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723042603.log
缺点:
代码太长了
3. StringUtil.format(String, Object…)
使⽤ lang.StringUtil.format(String, Object…)
内部封装了 String.format(String, Object)
@Test
public void testStringFormat(){
Date now = new Date();
String yearMonth = String(now, DatePattern.YEAR_AND_MONTH);
String expressDeliveryType = "sf";
形容中国的成语String fileName = String(now, DatePattern.TIMESTAMP);
String template = StringUtil.format("/home/expressdelivery/%s/%s/vipQuery_%s.log", yearMonth, expressDeliveryType, fileName);狮子座男生的性格
System.out.println(template);
}
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723043153.log
4. MessageFormatUtil.format(String, Object…)
使⽤ ext.MessageFormatUtil.format(String, Object…)
内部封装了 MessageFormat.format(String, Object…)
@Test
public void testMessageFormat(){
Date now = new Date();蜘蛛侠高清壁纸
String yearMonth = String(now, DatePattern.YEAR_AND_MONTH);
String expressDeliveryType = "sf";
String fileName = String(now, DatePattern.TIMESTAMP);
String template = MessageFormatUtil
.format("/home/expressdelivery/{0}/{1}/vipQuery_{2}.log", yearMonth, expressDeliveryType, fileName);
System.out.println(template);
}
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723043153.log
5. Slf4jUtil.format(String, Object…)
使⽤ ls.slf4j.Slf4jUtil.format(String, Object…)
借助 slf4j ⽇志占位符
@Test
public void testSlf4jFormat(){
Date now = new Date();
String yearMonth = String(now, DatePattern.YEAR_AND_MONTH);
String expressDeliveryType = "sf";
String fileName = String(now, DatePattern.TIMESTAMP);
String template = Slf4jUtil.format("/home/expressdelivery/{}/{}/vipQuery_{}.log", yearMonth, expressDeliveryType, fileName);
System.out.println(template);
}
输出:
/home/expressdelivery/2017-07/sf/vipQuery_20170723144236.log
6. place(CharSequence, Map)
使⽤ place(CharSequence, Map)
内部封装了 apache commons-lang3 StrSubstitutor , 现在叫 commons-text
使⽤给定的字符串 templateString 作为模板,解析匹配的变量 .
@Test
public void testReplace(){
Date date = new Date();
Map map = new HashMap<>();
map.put("yearMonth", String(date, YEAR_AND_MONTH));
map.put("expressDeliveryType", "sf");
map.put("fileName", String(date, TIMESTAMP));
String template =
}
输出:
/home/expressdelivery/2017-07/sf/vipQuery_20170723144608.log
优点:
模块可以定义变量名字了,不怕混乱
cot函数Note
此⽅法只能替换字符串,⽽不能像el表达式⼀样使⽤对象属性之类的来替换
7. VelocityUtil.parString(String, Map)
使⽤ ls.velocity.VelocityUtil.parString(String, Map)
该⽅法需要 jar
com.ls
feilong-tools-velocity
${version.feilong-platform}
@Test
public void testVelocityParString(){
Date date = new Date();
Map map = new HashMap<>();
map.put("yearMonth", String(date, YEAR_AND_MONTH));
map.put("expressDeliveryType", "sf");
map.put("fileName", String(date, TIMESTAMP));
VelocityUtil velocityUtil = new VelocityUtil();
String template = velocityUtil
.parString("/home/expressdelivery/${yearMonth}/${expressDeliveryType}/vipQuery_${fileName}.log", map); System.out.println(template);
}
输出
/home/expressdelivery/2017-07/sf/vipQuery_20170723145856.log
8. VelocityUtil.parTemplateWithClasspathResourceLoader(String, Map)
使⽤ ls.velocity.VelocityUtil.parTemplateWithClasspathResourceLoader(String, Map)该⽅法需要 jar
com.ls
feilong-tools-velocity
${version.feilong-platform}
该⽅法适合于 字符串模板独⽴成⽂件, ⽅便维护
路径是classpath 下⾯, ⽐如 velocity/path.vm
此时代码需要如此调⽤:
@Test
public void testVelocityParTemplateWithClasspathResourceLoader(){
Date date = new Date();
Map map = new HashMap<>();
map.put("yearMonth", String(date, YEAR_AND_MONTH));
map.put("expressDeliveryType", "sf");
map.put("fileName", String(date, TIMESTAMP));
VelocityUtil velocityUtil = new VelocityUtil();
String template = velocityUtil.parTemplateWithClasspathResourceLoader("velocity/path.vm", map); System.out.println(template);
}
输出 :
/home/expressdelivery/2017-07/sf/vipQuery_20170723150443.log
9. 性能对⽐