一个用于对于诸如 abc${p1}${p2}def 这样字符串进行处理的Java类

来源:互联网 发布:刘涛 黑历史 知乎 编辑:程序博客网 时间:2024/06/07 15:07

  用于对于诸如 abc${p1}${p2}def 这样字符串进行处理的Java类,使用一个Map来进行参数值设置。

package com.softparty.fw.common;import java.util.HashMap;import java.util.Map;/** * 从字符串中分析参数的类 */public class ParametersUtils {// 执行状态标识// NORMAL,普通状态// BEGIN,在 $ 字符之后// START,在 ${ 字符之后private static final int NORMAL = 0, BEGIN = 1, START = 2;// 保存结果private String result = "";/** * 构造器 * @param value * @param request */public ParametersUtils(String value, ValueCallbackHander hander) {this.parse(value, hander);}/** * 解析字符串 * @param value 带有${name}占位符的字符串 * @param hander 获取占位符参数的handler对象 */private void parse(String value, ValueCallbackHander hander) {// 保存结果字符串的字符串缓冲对象StringBuilder result = new StringBuilder(value.length());// 保存每个参数名称的字符串缓冲对象StringBuilder param = new StringBuilder();// 保存状态值int mark = NORMAL;// 遍历字符串for (int i = 0; i < value.length(); i++) {// 获取字符串指定字符char c = value.charAt(i);// 根据字符值进行分支switch (c) {case '$':// 对于状态为NORMAL的情况,转为BEGIN状态if (mark == NORMAL) {mark = BEGIN;} else {// 对于连续出现两个$字符的情况,忽略前一个$字符,维持BEGIN状态if (mark == BEGIN) {result.append('$');} else {// 如果是其它状态(START)result.append(c);}}break;case '{':// 对于BEGIN状态,将状态转为START状态if (mark == BEGIN) {mark = START;} else {// 对于其它状态,统一转为NORMALmark = NORMAL;// 加入result字符串result.append(c);}break;case '}':if (mark == START) {Object p = hander.getValue(param.toString());if (p == null) {p = "";}// 加入result字符串result.append(p.toString());param.setLength(0);} else {result.append(c);}// 对于START状态,转为NORMAL状态,并获取参数值mark = NORMAL;break;default:// 对于其它字符if (mark == START) {// 处理状态为START的param.append(c);} else {mark = NORMAL;}if (mark == NORMAL) {// 处理状态为NORMAL的result.append(c);}}}this.result = result.toString();}/** * 获取处理结果 */public String getResult() {return result;}/** * 测试 */public static void main(String[] args) {final Map<String, Object> map = new HashMap<>();map.put("name", "ok");map.put("test", 1234);map.put("ok", true);ParametersUtils utils = new ParametersUtils("hello$${name}${test},{ok}{${ok}}", new ValueCallbackHander() {@Overridepublic Object getValue(String key) {return map.get(key);}});System.out.println(utils.getResult());}}
  其中用到的ValueCallbackHandler接口如下:
package com.softparty.fw.common;/** * 用于根据Key获取Value的Handler接口 */public interface ValueCallbackHander {/** * 获取值 * @param key 指定的Key * @return 获取的值 */Object getValue(String key);}