Module java.base
Package java.lang

Interface StringTemplate.Processor<R,E extends Throwable>

类型参数:
R - 处理器的处理结果类型
E - 抛出的异常类型
所有已知的实现类:
FormatProcessor预览
封装的接口:
StringTemplate预览
函数式接口:
这是一个函数式接口,因此可以用作lambda表达式或方法引用的赋值目标。

@FunctionalInterface public static interface StringTemplate.Processor<R,E extends Throwable>
Processor 是Java平台的预览API。
仅当启用预览功能时,程序才能使用 Processor
预览功能可能会在将来的版本中被移除,或升级为Java平台的永久功能。
该接口描述了通用字符串模板处理器提供的方法。主要方法 process(StringTemplate) 用于验证和组合使用 StringTemplate预览 片段和值列表的结果。

例如:

class MyProcessor implements Processor<String, IllegalArgumentException> {
    @Override
    public String process(StringTemplate st) throws IllegalArgumentException {
         StringBuilder sb = new StringBuilder();
         Iterator<String> fragmentsIter = st.fragments().iterator();

         for (Object value : st.values()) {
             sb.append(fragmentsIter.next());

             if (value instanceof Boolean) {
                 throw new IllegalArgumentException("I don't like Booleans");
             }

             sb.append(value);
         }

         sb.append(fragmentsIter.next());

         return sb.toString();
    }
}

MyProcessor myProcessor = new MyProcessor();
try {
    int x = 10;
    int y = 20;
    String result = myProcessor."\{x} + \{y} = \{x + y}";
    ...
} catch (IllegalArgumentException ex) {
    ...
}
该接口的实现可以提供验证输入、将输入组合成结果以及在提供最终结果之前将中间字符串结果转换为非字符串值等功能。

用户可以选择验证组合中使用的输入。例如,SQL处理器可以通过清理输入或在SQL语句可能存在漏洞时抛出类型为 E 的异常来防止注入漏洞。

组合允许用户控制结果的组装方式。通常,用户将从字符串模板构造一个新字符串,其中占位符被值列表元素的字符串表示替换。这些字符串表示将被创建,就像调用 String.valueOf(java.lang.Object) 一样。

转换允许处理器返回除字符串以外的其他内容。例如,JSON处理器可以通过解析组合生成的字符串,而不是组合的字符串,返回一个JSON对象。

StringTemplate.Processor预览 是一个 FunctionalInterface。这允许使用lambda表达式声明处理器;

Processor<String, RuntimeException> processor = st -> {
    List<String> fragments = st.fragments();
    List<Object> values = st.values();
    // 检查或操作片段和/或值
    ...
    return StringTemplate.interpolate(fragments, values);
};
对于那些只需要处理字符串插值的处理器,可以使用 StringTemplate.interpolate()预览 方法;
Processor<String, RuntimeException> processor = StringTemplate::interpolate;
或者简单地将字符串插值转换为除 String 之外的其他内容;
Processor<JSONObject, RuntimeException> jsonProcessor = st -> new JSONObject(st.interpolate());
实现注意事项:
Java编译器会自动导入 StringTemplate.STR预览
参见 Java语言规范:
15.8.6 处理模板表达式
自Java版本:
21
另请参阅: