使用 ANTLR 实现公式解析

前言 做类似 BI 的产品时,会遇到公式解析场景。用户(前端)输入一个公式字符串,后端要解析为一个具体的函数对象。 我们使用 ANTLR 来做公式解析。 关于 ANTLR 的基本用法,及它在项目中的基本配置,参见:ANTLR4入门 本文并不是手把手教程,只讲核心点,其他不赘述。 定义函数类 我们会有一个 Function 的抽象类/接口,其他所有函数都继承 Function。函数可以套函数。 根据

ANTLR4 入门

简介 ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,它根据语法定义生成解析器,解析器可以构建和遍历解析树。 所有编程语言的语法,都可以用ANTLR来定义。ANTLR提供了大量的官方 grammar 示例。 核心概念 理解三个核心概念:Lexer、Parser、AST。 词法分析器(Lexer):将字符序列转换为单词(Token)

使用 Stopwatch 监控 sql 执行时间

这是我看到的一种模式,感觉挺实用的。可以用于监控任意代码的执行时间,比直接使用 System.currentTimeMillis() 稍微优雅一点点。 Stopwatch 是 guava 包中的工具类。 示例代码如下: log.info("begin to execute sql: {}", sql); Stopwatch stopwatch = Stopwatch.createStarted()

Lombok 常用注解

注解浅释 @Getter:生成 Getter 方法 @Setter:生成 Setter 方法 @ToString:生成 ToString 方法 @EqualsAndHashCode:生成 Equals 和 HashCode 方法,可通过 exclude 参数排除不需要的字段 @Data:包含了@Getter,@Setter,@ToString,@EqualsAndHashCode,@Require

Mac 下配置 Java 环境变量

今天突然遇到点问题,然后发现我居然从来没有配置过 Java 的环境变量,一直都是用的默认配置。 配置方式如下。 1 在 ~/.zprofile 中加入两行代码 export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home" export PATH="$JAVA_HOME:$PATH" 2 使配置

手写简易 HashMap

这是我去年碰到的一道面试题,当时直接整懵逼了。源码大致看过,原理也知道,突然要写还真写不出来。于是这两天又把这个问题翻出来,尝试写了一版。 1 明确需求 实现一个简易的 HashMap,包含 hashmap 的核心功能(put、get) 实现拉链法即可,不必实现红黑树 最好实现扩容逻辑 不支持 key 为 null 的情况(要支持也可以,需要单独处理,比较简单) 为了让需求更加明确,写了单元测试:

Java 中的小顶堆和大顶堆

这是一个非常简单的知识点,却也值得一记。 在 Java 中,是用 PriorityQueue 来实现堆的。 小顶堆和大顶堆的代码如下: // 小顶堆 new PriorityQueue<>(); // 大顶堆 new PriorityQueue<>(Comparator.reverseOrder());  

IntelliJ IDEA 社区版从零创建 Java Web(JSP) 项目

现在都是直接用 SpringBoot。不过偶尔还是会遇到一些使用 JSP 的情况,例如维护老项目,或者学生的学习项目。 本文记录了,在不依赖 SpringBoot,Maven 等工具的情况下,使用 IDEA 社区版,创建一个 Web 项目的过程。 0 前置条件 已下载 tomcat IDEA 社区版已安装 Smart Tomcat 插件 都很简单,略过不表。 1 创建一个空的 Java 项目 2

Mac 安装配置 Java8 过程记录

Mac 里装了 Java11,但是 Flink 需要 Java8,所以需要再装一个 Java8 的环境。 1 下载安装 Java8 在 oracle 官网找到 Mac 版本的下载地址:https://www.oracle.com/java/technologies/downloads/#java8,下载安装包 打开 dmg 文件,进行安装 安装完成后,jdk 的路径是 /Library/Java/

SpringBoot 自定义 404 页面

第一次做,绕了很久的弯路。详细总结一下。 一、背景 用 SpringBoot 写的后端服务,遇到 404 的时候,默认会返回一个 WhiteLable 页面(如图所示)。 可读性很差,因此: 我们需要有自定义的错误提示页面; 针对不同类型的错误(404、403、500),返回不同的错误页面。 二、步骤 Step1 加入 thymeleaf 依赖 在 build.gradle 中加入: implem