跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 基于 groovy 实现公式库
未分類
8 5 月 2020

基于 groovy 实现公式库

基于 groovy 实现公式库

資深大佬 : xinQing 1

在工作中基于 groovy 设计的公式库,希望能带给大家帮助。

项目地址

Github

语法

公式名(参数) 

比如:

ECHO(大侠王波波) 

支持公式嵌套:

公式名 1(公式名 2(参数), 参数) 

比如:

ECHO(UUID()) 

快速开始

  1. 创建 Formula 对象 formula
  2. 运行 formula.run(“script”)

下面是例子:

package tk.fishfish.formula;  import org.junit.Assert; import org.junit.Before; import org.junit.Test;  /**  * 公式测试  *  * @author 奔波儿灞  * @since 1.0  */ public class FormulaTest {      private Formula formula;      @Before     public void setup() {         formula = new Formula();     }      @Test     public void lower() {         Object result = formula.run("LOWER(ABC)");         Assert.assertEquals("abc", result);     }  }  

默认公式

这里只是抛砖引玉,实现了如下文本公式:

  • UUID() 返回 uuid
  • LOWER(xxx) 转小写
  • UPPER(xxx) 转大写

这里未实现丰富文本、时间、数学、逻辑等公式,只是提供一个扩展机制,方便大家定制自己的公式库。

开发自己的公式

  • 继承 Plugin 接口

    package tk.fishfish.formula.plugin;  import tk.fishfish.formula.annotation.FormulaMapping;  /**  * 自定义公式  *  * @author 奔波儿灞  * @since 1.0  */ public class CustomPlugin implements Plugin {      /**      * 实现自己的公式      *      * @param name 参数      * @return 结果      */     @FormulaMapping("ECHO")     public String echo(String name) {         return "echo: " + name;     }  }  
  • 自定义方法,增加 @FormulaMapping 注解 映射公式名称

  • 安装插件类,FormulaScript.installPlugin(CustomPlugin.class)

    package tk.fishfish.formula;  import org.junit.Assert; import org.junit.Before; import org.junit.Test; import tk.fishfish.formula.plugin.CustomPlugin; import tk.fishfish.formula.script.FormulaScript;  import java.math.BigDecimal;  /**  * 公式测试  *  * @author 奔波儿灞  * @since 1.0  */ public class FormulaTest {      private Formula formula;      @BeforeClass     public static void init() {         // 安装自己的公式插件         FormulaScript.installPlugin(CustomPlugin.class);     }      @Before     public void setup() {         formula = new Formula();     }      @Test     public void plugin() {         Object result = formula.run("ECHO(xxx)");         System.out.println(result);     }  }  

注意:

  • 先安装自己的公式,再创建 Formula 对象
  • 公式名全局不可重复

SPI 扩展

除了可以手动 FormulaScript.installPlugin(CustomPlugin.class) 安装自定义公式以外,还能通过 SPI 注册。

在 src/main/resources/META-INF/services 目录下创建名称为 tk.fishfish.formula.plugin.Plugin 的文件,里面是实现类的全类名:

# custom plugin tk.fishfish.formula.plugin.CustomPlugin 

此时,会自动通过 SPI 机制发现实现类,自动安装,实现解偶。

大佬有話說 (5)

  • 資深大佬 : pkwenda

    看着,如果做财务相关这样用会方便一些,可读性更好,性能方面 [eg:动态编译] 有测试损耗吗?

  • 資深大佬 : pkwenda

    @pkwenda #1 看着不错,吃字了

  • 資深大佬 : w292614191

    我们实现了 Excel 公式计算、行列变换、单元格引用计算、函数解析。

  • 主 資深大佬 : xinQing

    @pkwenda 初略测试下来,单次公式计算在 10ms 以下(主要看实现的代码,内存计算都相当快)。

  • 主 資深大佬 : xinQing

    @w292614191 我们主要是实现表单公式(比如,表单字段涉及数据变换、依赖),excel 这块到没有涉略噢

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具