Class StringTemplate

java.lang.Object
org.miaixz.bus.core.text.placeholder.StringTemplate
Direct Known Subclasses:
NamedStringTemplate, SingleStringTemplate

public abstract class StringTemplate extends Object
字符串模板 格式化 和 反解析 抽象父类
Since:
Java 17+
Author:
Kimi Liu
  • Field Details

    • globalFeatures

      protected static int globalFeatures
      全局默认策略,一旦修改,对所有模板对象都生效

      该值 是每个模板对象创建时的 策略初始值,因此,修改全局默认策略,不影响已经创建的模板对象

    • globalDefaultValueHandler

      protected static UnaryOperator<String> globalDefaultValueHandler
      全局默认值处理器,一旦修改,对所有模板对象都生效

      根据 占位符变量 返回 默认值

    • escape

      protected final char escape
      转义符,默认为: Symbol.C_BACKSLASH

      转义符如果标记在 占位符的开始或者结束 之前,则该占位符无效,属于普通字符串的一部分 例如,转义符为 '/',占位符为 "{}": 当字符串模板为 "I am /{}" 时,该模板中没有任何需要替换的占位符,格式化结果为 "I am {}"

      如果要打印转义符,使用双转义符即可,例如,转义符为 '/',占位符为 "{}": 当字符串模板为 "I am //{}" ,格式化参数为 "student", 格式化结果为 "I am /student"

    • defaultValue

      protected final String defaultValue
      占位符 没有找到 对应的填充值时 使用的默认值,如果没有,则使用 defaultValueHandler 提供默认值, 如果也没有,使用 globalDefaultValueHandler,还是没有,则抛出异常
    • defaultValueHandler

      protected final UnaryOperator<String> defaultValueHandler
      当前模板的默认值处理器,根据 占位变量 返回 默认值
    • segments

      protected List<StringSegment> segments
      模板中的所有固定文本和占位符
    • placeholderSegments

      protected List<AbstractSegment> placeholderSegments
      所有占位符
    • fixedTextTotalLength

      protected int fixedTextTotalLength
      模板中的固定文本长度,序列化时用于计算最终文本长度
  • Constructor Details

    • StringTemplate

      protected StringTemplate(String template, char escape, String defaultValue, UnaryOperator<String> defaultValueHandler, int features)
  • Method Details

    • of

      public static SingleStringTemplate.Builder of(String template)
      创建 单占位符模板对象的 Builder

      例如,"{}", "?", "$$$"

      Parameters:
      template - 字符串模板
      Returns:
      单占位符 模板对象的 Builder
    • ofNamed

      public static NamedStringTemplate.Builder ofNamed(String template)
      创建 有前缀和后缀的占位符模板对象的 Builder

      例如,"{0}", "{name}", "#{name}"

      Parameters:
      template - 字符串模板
      Returns:
      有前缀和后缀的占位符模板对象的 Builder
    • setGlobalFeatures

      public static void setGlobalFeatures(StringTemplate.Feature... globalFeatures)
      设置 全局默认策略,一旦修改,对所有模板对象都生效

      该值 是每个模板对象创建时的 策略初始值,因此,修改全局默认策略,不影响已经创建的模板对象

      Parameters:
      globalFeatures - 全局默认策略
    • setGlobalDefaultValue

      public static void setGlobalDefaultValue(UnaryOperator<String> globalDefaultValueHandler)
      设置 全局默认值处理器,一旦修改,对所有模板对象都生效
      Parameters:
      globalDefaultValueHandler - 全局默认处理器,根据 占位符变量 返回 默认值
    • getTemplate

      public String getTemplate()
      获取 模板字符串
      Returns:
      模板字符串
    • getFeatures

      public int getFeatures()
      获取 当前模板的 策略值
      Returns:
      策略值
    • isMatches

      public boolean isMatches(String text)
      校验 传入的字符串 是否和模板匹配
      Parameters:
      text - 校验字符串,应该是由格式化方法生成的字符串
      Returns:
      是否和模板匹配
    • getPlaceholderVariableNames

      public List<String> getPlaceholderVariableNames()
      获取 所有占位变量名称列表

      例如,"{}"->"{}"、"{name}"->"name"

      Returns:
      所有占位变量名称列表
    • getPlaceholderTexts

      public List<String> getPlaceholderTexts()
      获取 所有占位符的完整文本列表

      例如,"{}"->"{}"、"{name}"->"{name}"

      Returns:
      所有占位符的完整文本列表
    • formatRawByKey

      public String formatRawByKey(Function<String,String> valueSupplier)
      根据 原始数据 生成 格式化字符串

      依次遍历模板中的 占位符,根据 占位符 返回 需要序列化的值

      不对 占位符 和 参数值 做任何处理,由用户抉择

      Parameters:
      valueSupplier - 根据 占位符 返回 需要序列化的值的字符串形式,例如: data -> map.get(data)
      Returns:
      模板格式化之后的结果
    • formatRawBySegment

      public String formatRawBySegment(Function<AbstractSegment,String> valueSupplier)
      根据 原始数据 生成 格式化字符串

      依次遍历模板中的 占位符,根据 占位符 返回 需要序列化的值

      不对 占位符 和 参数值 做任何处理,由用户抉择

      Parameters:
      valueSupplier - 根据 占位符 返回 需要序列化的值的字符串形式,例如: segment -> map.get(segment.getPlaceholder())
      Returns:
      模板格式化之后的结果
    • formatSequence

      protected String formatSequence(Iterable<?> iterable)
      按顺序使用 迭代器元素 替换 占位符
      Parameters:
      iterable - iterable
      Returns:
      格式化字符串
    • formatBySegment

      protected String formatBySegment(Function<AbstractSegment,?> valueSupplier)
      根据 策略 和 默认值 处理需要序列化的值, 生成 格式化字符串

      依次遍历模板中的 占位符,根据 占位符 返回 需要序列化的值

      Parameters:
      valueSupplier - 根据 占位符 返回 需要序列化的值,如果返回值不是 String,则使用 StringKit.toString(Object) 方法转为字符串
      Returns:
      模板格式化之后的结果
    • formatMissingKey

      protected String formatMissingKey(AbstractSegment segment)
      根据 策略 返回 格式化参数中 找不到 占位符 时的默认值

      例如,map中没有 占位符变量 这个key;基于下标的参数中,找不到 占位符下标 对应的 列表元素

      Parameters:
      segment - 占位符
      Returns:
      参数中找不到占位符时的默认值
    • formatNullValue

      protected String formatNullValue(AbstractSegment segment)
      根据 策略 返回 占位符 对应的值为 null 时的返回值
      Parameters:
      segment - 占位符
      Returns:
      占位符对应的值为 null 时的返回值
    • matchesRawByKey

      public void matchesRawByKey(String text, BiConsumer<String,String> keyValueConsumer)
      原始数据的解析方法

      不对 占位符 和 解析得到的值 做任何处理,由用户抉择

      Parameters:
      text - 待解析的字符串
      keyValueConsumer - 消费 占位符变量名称 和 占位符对应的解析得到的字符串值,例如:(data, value) -> map.put(data, value)
    • matchesRawBySegment

      public void matchesRawBySegment(String text, BiConsumer<AbstractSegment,String> keyValueConsumer)
      原始数据的解析方法

      不对 占位符 和 解析得到的值 做任何处理,由用户抉择

      Parameters:
      text - 待解析的字符串
      keyValueConsumer - 消费 占位符 和 占位符对应的解析得到的字符串值,例如:(data, value) -> map.put(data, value)
    • matchesSequence

      protected List<String> matchesSequence(String text)
      将 占位符位置的值 按顺序解析为 字符串列表
      Parameters:
      text - 待解析的字符串,一般是格式化方法的返回值
      Returns:
      字符串列表
    • matchesByKey

      public void matchesByKey(String text, BiConsumer<String,String> keyValueConsumer)
      根据 策略 和 默认值 获得最终的 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

      protected String getDefaultValue(AbstractSegment segment)
      根据 占位符 返回默认值

      根据定义的默认值、默认值提供者、全局默认值提供者,返回默认值

      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

      protected abstract List<StringSegment> parseSegments(String template)
      将 模板 解析为 SectionBuffer 列表
      Parameters:
      template - 字符串模板
      Returns:
      Segment列表
    • getSegments

      protected List<StringSegment> getSegments()
      获取 模板中 所有segment
      Returns:
      segment列表
    • getPlaceholderSegments

      protected List<AbstractSegment> getPlaceholderSegments()
      获取 模板中的 占位符 segment
      Returns:
      占位符列表