java短信模板 有占位符_java模板字符串优雅解析(占位符解析)

/**

* 占位符解析器

*

* @author meilin.huang

* @version 1.0

* @date 2018-11-13 1:42 PM

*/

publicclassPlaceholderResolver{

/**

* 默认前缀占位符

*/

publicstaticfinalStringDEFAULT_PLACEHOLDER_PREFIX="${";

/**

* 默认后缀占位符

*/

publicstaticfinalStringDEFAULT_PLACEHOLDER_SUFFIX="}";

/**

* 默认单例解析器

*/

privatestaticPlaceholderResolverdefaultResolver=newPlaceholderResolver();

/**

* 占位符前缀

*/

privateStringplaceholderPrefix=DEFAULT_PLACEHOLDER_PREFIX;

/**

* 占位符后缀

*/

privateStringplaceholderSuffix=DEFAULT_PLACEHOLDER_SUFFIX;

privatePlaceholderResolver(){}

privatePlaceholderResolver(StringplaceholderPrefix,StringplaceholderSuffix){

this.placeholderPrefix=placeholderPrefix;

this.placeholderSuffix=placeholderSuffix;

}

/**

* 获取默认的占位符解析器,即占位符前缀为"${", 后缀为"}"

* @return

*/

publicstaticPlaceholderResolvergetDefaultResolver(){

returndefaultResolver;

}

publicstaticPlaceholderResolvergetResolver(StringplaceholderPrefix,StringplaceholderSuffix){

returnnewPlaceholderResolver(placeholderPrefix,placeholderSuffix);

}

/**

* 解析带有指定占位符的模板字符串,默认占位符为前缀:${ 后缀:}

* 如:template = category:${}:product:${}

* values = {"1", "2"}

* 返回 category:1:product:2

*

* @param content 要解析的带有占位符的模板字符串

* @param values 按照模板占位符索引位置设置对应的值

* @return

*/

publicStringresolve(Stringcontent,String...values){

intstart=content.indexOf(this.placeholderPrefix);

if(start==-1){

returncontent;

}

//值索引

intvalueIndex=0;

StringBuilderresult=newStringBuilder(content);

while(start!=-1){

intend=result.indexOf(this.placeholderSuffix);

StringreplaceContent=values[valueIndex++];

result.replace(start,end+this.placeholderSuffix.length(),replaceContent);

start=result.indexOf(this.placeholderPrefix,start+replaceContent.length());

}

returnresult.toString();

}

/**

* 解析带有指定占位符的模板字符串,默认占位符为前缀:${ 后缀:}

* 如:template = category:${}:product:${}

* values = {"1", "2"}

* 返回 category:1:product:2

*

* @param content 要解析的带有占位符的模板字符串

* @param values 按照模板占位符索引位置设置对应的值

* @return

*/

publicStringresolve(Stringcontent,Object[]values){

returnresolve(content,Stream.of(values).map(String::valueOf).toArray(String[]::new));

}

/**

* 根据替换规则来替换指定模板中的占位符值

* @param content 要解析的字符串

* @param rule 解析规则回调

* @return

*/

publicStringresolveByRule(Stringcontent,Functionrule){

intstart=content.indexOf(this.placeholderPrefix);

if(start==-1){

returncontent;

}

StringBuilderresult=newStringBuilder(content);

while(start!=-1){

intend=result.indexOf(this.placeholderSuffix,start);

//获取占位符属性值,如${id}, 即获取id

Stringplaceholder=result.substring(start+this.placeholderPrefix.length(),end);

//替换整个占位符内容,即将${id}值替换为替换规则回调中的内容

StringreplaceContent=placeholder.trim().isEmpty()?"":rule.apply(placeholder);

result.replace(start,end+this.placeholderSuffix.length(),replaceContent);

start=result.indexOf(this.placeholderPrefix,start+replaceContent.length());

}

returnresult.toString();

}

/**

* 替换模板中占位符内容,占位符的内容即为map key对应的值,key为占位符中的内容。

* 如:content = product:${id}:detail:${did}

* valueMap = id -> 1; pid -> 2

* 经过解析返回 product:1:detail:2

*

* @param content 模板内容。

* @param valueMap 值映射

* @return 替换完成后的字符串。

*/

publicStringresolveByMap(Stringcontent,finalMapvalueMap){

returnresolveByRule(content,placeholderValue->String.valueOf(valueMap.get(placeholderValue)));

}

/**

* 根据properties文件替换占位符内容

* @param content

* @param properties

* @return

*/

publicStringresolveByProperties(Stringcontent,finalPropertiesproperties){

returnresolveByRule(content,placeholderValue->properties.getProperty(placeholderValue));

}

/**

* 根据对象中字段路径(即类似js访问对象属性值)替换模板中的占位符

* 如 content = product:${id}:detail:${detail.id}

* obj = Product.builder().id(1).detail(Detail.builder().id(2).build()).build();

* 经过解析返回 product:1:detail:2

*

* @param content 要解析的内容

* @param obj 填充解析内容的对象(如果是基本类型,则所有占位符替换为相同的值)

* @return

*/

publicStringresolveByObject(Stringcontent,finalObjectobj){

if(objinstanceofMap){

returnresolveByMap(content,(Map)obj);

}

returnresolveByRule(content,placeholderValue->String.valueOf(ReflectionUtils.getValueByFieldPath(obj,placeholderValue)));

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值