一個簡單的Java模板工具類(二)—簡單運算式解析實現

來源:互聯網
上載者:User

標籤:

以前寫過一個, 用正則比較不高效, 所以用運算式解析方式又實現了一個, 練手.

以前的: http://my.oschina.net/haogrgr/blog/222349

現在的:

import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Objects;/** * 非常非常簡單的模板實現 *  * @author desheng.tu * @date 2015年6月23日 下午4:38:05 * */public class SimpleTmpl {public static void main(String[] args) {String t1 = "你好 $$name$$, 您的驗證碼是:$$code$$";String t2 = "你好 #{name}, 您的驗證碼是:${code}";Map<String, Object> param = MapBuilder.makeO("name", "haogrgr").build("code", "1314");for (int i = 0; i < 100; i++) {SimpleTempletUtil.render(t1, param);Templ.of(t2).render(param);}String result = "";long start = 0;start = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {param.put("code", i);result = SimpleTempletUtil.render(t1, param);}System.out.println(System.currentTimeMillis() - start);System.out.println(result);start = System.currentTimeMillis();Templ templ = Templ.of(t2);for (int i = 0; i < 100000; i++) {param.put("code", i);result = templ.render(param);}System.out.println(System.currentTimeMillis() - start);System.out.println(result);}}abstract class Exp {abstract String resolve(Map<String, Object> context);static Exp of(String exp) {Objects.requireNonNull(exp);if (exp.startsWith("#{") || exp.startsWith("${")) {return new VarExp(exp);}return new StrExp(exp);}}class StrExp extends Exp {String value;StrExp(String exp) {this.value = exp;}@Overridepublic String resolve(Map<String, Object> context) {return this.value;}@Overridepublic String toString() {return "StrExp [value=" + value + "]";}}class VarExp extends Exp {String varName;String defaultValue;Boolean nullable = false;VarExp(String varName, String defaultValue, Boolean nullable) {this.varName = varName;this.defaultValue = defaultValue;this.nullable = nullable;}VarExp(String exp) {Objects.requireNonNull(exp);if (!(exp.startsWith("#{") || exp.startsWith("${")) || !exp.endsWith("}")) {throw new IllegalArgumentException("運算式[" + exp + "]必須類似於#{}或${}");}String[] nodes = exp.substring(2, exp.length() - 1).split(",");if (nodes.length > 2) {throw new IllegalArgumentException("運算式[" + exp + "]只能出現一個‘,‘");}this.varName = nodes[0].trim();this.defaultValue = nodes.length == 2 ? nodes[1].trim() : "";this.nullable = exp.startsWith("$");}@Overridepublic String resolve(Map<String, Object> context) {Object value = context.get(varName);if (value == null && nullable) {value = defaultValue == null ? "" : defaultValue;}if (value == null) {throw new NullPointerException("上下文中沒有指定的變數:var=" + varName + " map=" + context);}return value.toString();}@Overridepublic String toString() {return "VarExp [varName=" + varName + ", defaultValue=" + defaultValue + ", nullable="+ nullable + "]";}}class Templ {List<Exp> exps = new ArrayList<>();static Templ of(String templStr) {Objects.requireNonNull(templStr, "模板為空白");Templ templ = new Templ();StringBuilder sb = new StringBuilder();char[] chars = templStr.toCharArray();for (int i = 0; i < chars.length; i++) {switch (chars[i]) {case ‘#‘:case ‘$‘:if(i < chars.length - 1 && chars[i+1] == ‘{‘){templ.addExp(Exp.of(sb.toString()));sb.setLength(0);}sb.append(chars[i]);break;case ‘}‘:sb.append(‘}‘);if(sb.charAt(1) == ‘{‘){templ.addExp(Exp.of(sb.toString()));sb.setLength(0);}break;default:sb.append(chars[i]);break;}}if(sb.length() > 0){templ.addExp(Exp.of(sb.toString()));}return templ;}Templ addExp(Exp exp) {Objects.requireNonNull(exp, "運算式為空白");exps.add(exp);return this;}String render(Map<String, Object> context) {StringBuilder sb = new StringBuilder(128);for (Exp exp : exps) {sb.append(exp.resolve(context));}return sb.toString();}}


一個簡單的Java模板工具類(二)—簡單運算式解析實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.