Class StringTemplate
java.lang.Object
org.miaixz.bus.core.text.placeholder.StringTemplate
- Direct Known Subclasses:
NamedStringTemplate,SingleStringTemplate
字符串模板 格式化 和 反解析 抽象父类
- Since:
- Java 17+
- Author:
- Kimi Liu
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static classStringTemplate.AbstractBuilder<BuilderChild extends StringTemplate.AbstractBuilder<BuilderChild,TemplateChild>, TemplateChild extends StringTemplate> 抽象Builderstatic enum格式化 和 解析 策略 -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final String占位符 没有找到 对应的填充值时 使用的默认值,如果没有,则使用defaultValueHandler提供默认值, 如果也没有,使用globalDefaultValueHandler,还是没有,则抛出异常protected final UnaryOperator<String> 当前模板的默认值处理器,根据 占位变量 返回 默认值protected final char转义符,默认为:Symbol.C_BACKSLASHprotected int模板中的固定文本长度,序列化时用于计算最终文本长度protected static UnaryOperator<String> 全局默认值处理器,一旦修改,对所有模板对象都生效protected static int全局默认策略,一旦修改,对所有模板对象都生效protected List<AbstractSegment> 所有占位符protected List<StringSegment> 模板中的所有固定文本和占位符 -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedStringTemplate(String template, char escape, String defaultValue, UnaryOperator<String> defaultValueHandler, int features) 构造 -
Method Summary
Modifier and TypeMethodDescriptionprotected voidaddLiteralSegment(boolean isLastLiteralSegment, List<StringSegment> list, String newText) 添加 固定文本segment,过滤 空字符串 并 合并相邻的固定文本protected void一些公共的初始化代码protected StringformatBySegment(Function<AbstractSegment, ?> valueSupplier) 根据 策略 和 默认值 处理需要序列化的值, 生成 格式化字符串protected StringformatMissingKey(AbstractSegment segment) 根据 策略 返回 格式化参数中 找不到 占位符 时的默认值protected StringformatNullValue(AbstractSegment segment) 根据 策略 返回 占位符 对应的值为null时的返回值formatRawByKey(Function<String, String> valueSupplier) 根据 原始数据 生成 格式化字符串formatRawBySegment(Function<AbstractSegment, String> valueSupplier) 根据 原始数据 生成 格式化字符串protected StringformatSequence(Iterable<?> iterable) 按顺序使用 迭代器元素 替换 占位符protected StringgetDefaultValue(AbstractSegment segment) 根据 占位符 返回默认值int获取 当前模板的 策略值protected List<AbstractSegment> 获取 模板中的 占位符 segment获取 所有占位符的完整文本列表获取 所有占位变量名称列表protected List<StringSegment> 获取 模板中 所有segment获取 模板字符串protected boolean是否有默认值boolean校验 传入的字符串 是否和模板匹配voidmatchesByKey(String text, BiConsumer<String, String> keyValueConsumer) 根据 策略 和 默认值 获得最终的 value,由消费者处理该 valueprotected voidmatchesByKey(String text, BiConsumer<String, String> keyValueConsumer, boolean hasDefaultValue, Function<AbstractSegment, String> defaultValueSupplier) 根据 策略 和 默认值 获得最终的 value,由消费者处理该 valuevoidmatchesRawByKey(String text, BiConsumer<String, String> keyValueConsumer) 原始数据的解析方法voidmatchesRawBySegment(String text, BiConsumer<AbstractSegment, String> keyValueConsumer) 原始数据的解析方法matchesSequence(String text) 将 占位符位置的值 按顺序解析为 字符串列表static SingleStringTemplate.Builder创建 单占位符模板对象的 Builderstatic NamedStringTemplate.Builder创建 有前缀和后缀的占位符模板对象的 Builderprotected abstract List<StringSegment> parseSegments(String template) 将 模板 解析为 SectionBuffer 列表static voidsetGlobalDefaultValue(UnaryOperator<String> globalDefaultValueHandler) 设置 全局默认值处理器,一旦修改,对所有模板对象都生效static voidsetGlobalFeatures(StringTemplate.Feature... globalFeatures) 设置 全局默认策略,一旦修改,对所有模板对象都生效
-
Field Details
-
globalFeatures
protected static int globalFeatures全局默认策略,一旦修改,对所有模板对象都生效该值 是每个模板对象创建时的 策略初始值,因此,修改全局默认策略,不影响已经创建的模板对象
-
globalDefaultValueHandler
全局默认值处理器,一旦修改,对所有模板对象都生效根据 占位符变量 返回 默认值
-
escape
protected final char escape转义符,默认为:Symbol.C_BACKSLASH转义符如果标记在 占位符的开始或者结束 之前,则该占位符无效,属于普通字符串的一部分 例如,转义符为 '/',占位符为 "{}": 当字符串模板为 "I am /{}" 时,该模板中没有任何需要替换的占位符,格式化结果为 "I am {}"
如果要打印转义符,使用双转义符即可,例如,转义符为 '/',占位符为 "{}": 当字符串模板为 "I am //{}" ,格式化参数为 "student", 格式化结果为 "I am /student"
-
defaultValue
占位符 没有找到 对应的填充值时 使用的默认值,如果没有,则使用defaultValueHandler提供默认值, 如果也没有,使用globalDefaultValueHandler,还是没有,则抛出异常 -
defaultValueHandler
当前模板的默认值处理器,根据 占位变量 返回 默认值 -
segments
模板中的所有固定文本和占位符 -
placeholderSegments
所有占位符 -
fixedTextTotalLength
protected int fixedTextTotalLength模板中的固定文本长度,序列化时用于计算最终文本长度
-
-
Constructor Details
-
StringTemplate
protected StringTemplate(String template, char escape, String defaultValue, UnaryOperator<String> defaultValueHandler, int features) 构造- Parameters:
template- 字符串模板escape- 转义符defaultValue- 默认值defaultValueHandler- 默认值处理器features- 策略值
-
-
Method Details
-
of
创建 单占位符模板对象的 Builder例如,"{}", "?", "$$$"
- Parameters:
template- 字符串模板- Returns:
- 单占位符 模板对象的 Builder
-
ofNamed
创建 有前缀和后缀的占位符模板对象的 Builder例如,"{0}", "{name}", "#{name}"
- Parameters:
template- 字符串模板- Returns:
- 有前缀和后缀的占位符模板对象的 Builder
-
setGlobalFeatures
设置 全局默认策略,一旦修改,对所有模板对象都生效该值 是每个模板对象创建时的 策略初始值,因此,修改全局默认策略,不影响已经创建的模板对象
- Parameters:
globalFeatures- 全局默认策略
-
setGlobalDefaultValue
设置 全局默认值处理器,一旦修改,对所有模板对象都生效- Parameters:
globalDefaultValueHandler- 全局默认处理器,根据 占位符变量 返回 默认值
-
getTemplate
获取 模板字符串- Returns:
- 模板字符串
-
getFeatures
public int getFeatures()获取 当前模板的 策略值- Returns:
- 策略值
-
isMatches
校验 传入的字符串 是否和模板匹配- Parameters:
text- 校验字符串,应该是由格式化方法生成的字符串- Returns:
- 是否和模板匹配
-
getPlaceholderVariableNames
获取 所有占位变量名称列表例如,"{}"->"{}"、"{name}"->"name"
- Returns:
- 所有占位变量名称列表
-
getPlaceholderTexts
获取 所有占位符的完整文本列表例如,"{}"->"{}"、"{name}"->"{name}"
- Returns:
- 所有占位符的完整文本列表
-
formatRawByKey
根据 原始数据 生成 格式化字符串依次遍历模板中的 占位符,根据 占位符 返回 需要序列化的值
不对 占位符 和 参数值 做任何处理,由用户抉择
- Parameters:
valueSupplier- 根据 占位符 返回 需要序列化的值的字符串形式,例如:data -> map.get(data)- Returns:
- 模板格式化之后的结果
-
formatRawBySegment
根据 原始数据 生成 格式化字符串依次遍历模板中的 占位符,根据 占位符 返回 需要序列化的值
不对 占位符 和 参数值 做任何处理,由用户抉择
- Parameters:
valueSupplier- 根据 占位符 返回 需要序列化的值的字符串形式,例如:segment -> map.get(segment.getPlaceholder())- Returns:
- 模板格式化之后的结果
-
formatSequence
按顺序使用 迭代器元素 替换 占位符- Parameters:
iterable- iterable- Returns:
- 格式化字符串
-
formatBySegment
根据 策略 和 默认值 处理需要序列化的值, 生成 格式化字符串依次遍历模板中的 占位符,根据 占位符 返回 需要序列化的值
- Parameters:
valueSupplier- 根据 占位符 返回 需要序列化的值,如果返回值不是String,则使用StringKit.toString(Object)方法转为字符串- Returns:
- 模板格式化之后的结果
-
formatMissingKey
根据 策略 返回 格式化参数中 找不到 占位符 时的默认值例如,map中没有 占位符变量 这个key;基于下标的参数中,找不到 占位符下标 对应的 列表元素
- Parameters:
segment- 占位符- Returns:
- 参数中找不到占位符时的默认值
-
formatNullValue
根据 策略 返回 占位符 对应的值为null时的返回值- Parameters:
segment- 占位符- Returns:
- 占位符对应的值为
null时的返回值
-
matchesRawByKey
原始数据的解析方法不对 占位符 和 解析得到的值 做任何处理,由用户抉择
- Parameters:
text- 待解析的字符串keyValueConsumer- 消费 占位符变量名称 和 占位符对应的解析得到的字符串值,例如:(data, value) -> map.put(data, value)
-
matchesRawBySegment
原始数据的解析方法不对 占位符 和 解析得到的值 做任何处理,由用户抉择
- Parameters:
text- 待解析的字符串keyValueConsumer- 消费 占位符 和 占位符对应的解析得到的字符串值,例如:(data, value) -> map.put(data, value)
-
matchesSequence
将 占位符位置的值 按顺序解析为 字符串列表- Parameters:
text- 待解析的字符串,一般是格式化方法的返回值- Returns:
- 字符串列表
-
matchesByKey
根据 策略 和 默认值 获得最终的 value,由消费者处理该 value- Parameters:
text- 待解析的字符串keyValueConsumer- 按占位符顺序 消费 占位符变量 和 最终的value,例如:(data, value) -> map.put(data, value)
-
matchesByKey
protected void matchesByKey(String text, BiConsumer<String, String> keyValueConsumer, boolean hasDefaultValue, Function<AbstractSegment, String> defaultValueSupplier) 根据 策略 和 默认值 获得最终的 value,由消费者处理该 value- Parameters:
text- 待解析的字符串keyValueConsumer- 按占位符顺序 消费 占位符变量 和 最终的value,例如:(data, value) -> map.put(data, value)hasDefaultValue- 是否有默认值defaultValueSupplier- 默认值提供者,根据 占位符 返回 默认值
-
hasDefaultValue
protected boolean hasDefaultValue()是否有默认值- Returns:
- 是否有默认值
-
getDefaultValue
根据 占位符 返回默认值根据定义的默认值、默认值提供者、全局默认值提供者,返回默认值
- Parameters:
segment- 占位符- Returns:
- 默认值
-
afterInit
protected void afterInit()一些公共的初始化代码由于此时子类还没构造完成,所以只能由子类构造方法调用
-
addLiteralSegment
protected void addLiteralSegment(boolean isLastLiteralSegment, List<StringSegment> list, String newText) 添加 固定文本segment,过滤 空字符串 并 合并相邻的固定文本- Parameters:
isLastLiteralSegment- 上一个新增的segment是否是固定文本list- 已保存的segment列表newText- 新的固定文本
-
parseSegments
将 模板 解析为 SectionBuffer 列表- Parameters:
template- 字符串模板- Returns:
- Segment列表
-
getSegments
获取 模板中 所有segment- Returns:
- segment列表
-
getPlaceholderSegments
获取 模板中的 占位符 segment- Returns:
- 占位符列表
-