大模型FunctionCall的利器:Java执行Groovy脚本万能工具类详解(上篇)

大模型FunctionCall的利器:Java执行Groovy脚本万能工具类详解(上篇)

2766945adefee1afbffcaafe96f97cde
2766945adefee1afbffcaafe96f97cde
2025年5月24日
大模型FunctionCallMCPGroovyJava

前言

在现代软件开发中,特别是大模型AI应用蓬勃发展的今天,我们经常遇到需要动态执行代码的场景。无论是传统的配置化业务规则、动态表达式计算,还是新兴的大模型FunctionCall、**工具调用(MCP)**等AI应用场景,都需要一个强大而灵活的动态代码执行引擎。

Groovy作为一门运行在JVM上的动态语言,为我们提供了一个优雅的解决方案。正因为Groovy强大的脚本执行能力,使其非常适合用在现有的大模型FunctionCall或工具调用(MCP)场景中,可以根据大模型返回的字符串类型的工具名称+参数直接执行得到运行结果

本系列文章将从零开始,带您了解Groovy,并手把手教您编写一个Java执行Groovy脚本的万能工具类,特别关注其在AI时代的应用价值。

本篇(上篇)主要内容:

  • Groovy语言基础与核心特性
  • Groovy与Java的深度关系
  • Groovy脚本的强大便利性

下篇将重点介绍:

  • 万能工具类的具体实现
  • 大模型工具调用场景应用
  • 高级特性与最佳实践

一、什么是Groovy?

1.1 Groovy的历史与定义

Groovy是一种基于Java虚拟机(JVM)的动态面向对象编程语言,由James Strachan在2003年创建,并于2007年成为Apache软件基金会的顶级项目。Groovy的设计理念是在保持Java强大功能的同时,提供更加简洁、灵活的语法。

Groovy的核心定位:

  • Java的超集:几乎所有有效的Java代码都是有效的Groovy代码
  • 动态语言:支持动态类型、元编程、运行时方法调用
  • 脚本语言:可以作为脚本直接执行,无需编译
  • DSL构建工具:特别适合构建领域特定语言

1.2 Groovy的技术架构

┌─────────────────┐
│   Groovy代码    │
└─────────────────┘
         │
         ▼
┌─────────────────┐
│  Groovy编译器   │  ← 将Groovy代码编译为Java字节码
└─────────────────┘
         │
         ▼
┌─────────────────┐
│   Java字节码    │
└─────────────────┘
         │
         ▼
┌─────────────────┐
│      JVM        │  ← 在Java虚拟机上运行
└─────────────────┘

1.3 Groovy的核心特性详解

1.3.1 简洁的语法

// Java写法
public class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

// Groovy写法
class Person {
    String name
    int age
    
    String toString() {
        "Person{name='$name', age=$age}"
    }
}

// 使用示例
def person = new Person(name: "张三", age: 25)
println person  // 输出: Person{name='张三', age=25}

1.3.2 动态类型系统

// 动态类型声明
def variable = "字符串"  // String类型
variable = 42           // 现在是Integer类型
variable = [1, 2, 3]    // 现在是List类型
variable = [a: 1, b: 2] // 现在是Map类型

// 类型推断
String name = "张三"    // 显式类型
def age = 25           // 自动推断为Integer
def salary = 5000.50   // 自动推断为BigDecimal

// 动态方法调用
def obj = "hello"
println obj.toUpperCase()    // 调用String方法
obj = [1, 2, 3]
println obj.size()          // 调用List方法

1.3.3 强大的字符串处理

// 1. 字符串插值
def name = "张三"
def age = 25
def message = "姓名: ${name}, 年龄: ${age}"
println message  // 输出: 姓名: 张三, 年龄: 25

// 2. 多行字符串
def multilineString = """
    这是一个
    多行字符串
    可以包含换行符
"""

// 3. 字符串模板
def template = '''
    用户信息:
    姓名:${name}
    年龄:${age}
    状态:${age >= 18 ? '成年' : '未成年'}
'''

// 4. 正则表达式支持
def pattern = ~/\d+/
def text = "我今年25岁"
def matcher = text =~ pattern
if (matcher) {
    println "找到数字: ${matcher[0]}"  // 输出: 找到数字: 25
}

1.3.4 集合操作的函数式编程

// 列表操作
def numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// 过滤偶数
def evenNumbers = numbers.findAll { it % 2 == 0 }
println evenNumbers  // [2, 4, 6, 8, 10]

// 转换操作
def squares = numbers.collect { it * it }
println squares  // [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

// 聚合操作
def sum = numbers.sum()
def max = numbers.max()
def avg = numbers.sum() / numbers.size()

// 链式操作
def result = numbers
    .findAll { it > 3 }          // 过滤大于3的数
    .collect { it * 2 }          // 每个数乘以2
    .sort { a, b -> b <=> a }    // 降序排列
println result  // [20, 18, 16, 14, 12, 10, 8]

// Map操作
def userMap = [
    "张三": [age: 25, city: "北京"],
    "李四": [age: 30, city: "上海"],
    "王五": [age: 22, city: "广州"]
]

// 过滤成年用户
def adults = userMap.findAll { name, info -> info.age >= 25 }
println adults  // [张三:[age:25, city:北京], 李四:[age:30, city:上海]]

1.3.5 闭包(Closure)详解

// 基本闭包语法
def simpleClosure = { println "Hello Closure!" }
simpleClosure()  // 调用闭包

// 带参数的闭包
def greetClosure = { name -> println "Hello, $name!" }
greetClosure("张三")  // 输出: Hello, 张三!

// 多参数闭包
def addClosure = { a, b -> a + b }
println addClosure(5, 3)  // 输出: 8

// 默认参数it
def squareClosure = { it * it }
println squareClosure(5)  // 输出: 25

// 闭包作为参数传递
def processNumber(number, closure) {
    closure(number)
}

processNumber(10) { num ->
    println "数字的平方是: ${num * num}"
}

// 闭包访问外部变量
def multiplier = 3
def multiplyClosure = { number ->
    number * multiplier  // 访问外部变量
}
println multiplyClosure(5)  // 输出: 15

1.3.6 元编程能力

// 1. 动态添加方法
String.metaClass.isPalindrome = {
    delegate == delegate.reverse()
}

println "level".isPalindrome()  // true
println "hello".isPalindrome()  // false

// 2. 动态添加属性
class Person {
    String name
}

Person.metaClass.age = 0

def person = new Person(name: "张三")
person.age = 25
println "${person.name} is ${person.age} years old"

// 3. 方法拦截
class Calculator {
    def methodMissing(String name, args) {
        if (name.startsWith("add")) {
            return args.sum()
        } else if (name.startsWith("multiply")) {
            return args.inject(1) { result, item -> result * item }
        }
        throw new MissingMethodException(name, Calculator, args)
    }
}

def calc = new Calculator()
println calc.addNumbers(1, 2, 3, 4)      // 10
println calc.multiplyNumbers(2, 3, 4)    // 24

1.4 Groovy的优势与局限性

1.4.1 主要优势

  1. 学习成本低:Java开发者可以快速上手
  2. 开发效率高:代码更简洁,开发速度更快
  3. 集成性好:与现有Java项目无缝集成
  4. 灵活性强:支持动态特性和元编程
  5. 生态丰富:可以使用所有Java库和框架

1.4.2 潜在局限性

  1. 性能开销:动态特性带来一定的性能损失
  2. 编译时检查:缺少Java的强类型检查
  3. 调试复杂性:动态特性可能增加调试难度
  4. 团队接受度:需要团队学习新的语法和概念

1.5 Groovy的典型应用场景

1.5.1 构建脚本

// Gradle构建脚本示例
plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.0'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

task customTask {
    doLast {
        println "执行自定义任务"
    }
}

1.5.2 测试脚本

// Spock测试框架示例
class CalculatorSpec extends Specification {
    def "测试加法运算"() {
        given: "给定计算器和两个数"
        def calculator = new Calculator()
        
        when: "执行加法运算"
        def result = calculator.add(a, b)
        
        then: "验证结果"
        result == expected
        
        where: "测试数据"
        a | b | expected
        1 | 2 | 3
        5 | 3 | 8
        0 | 0 | 0
    }
}

1.5.3 配置管理

// 应用配置脚本
environments {
    development {
        database {
            url = "jdbc:h2:mem:devDb"
            username = "sa"
            password = ""
        }
    }
    production {
        database {
            url = "jdbc:mysql://prod-server:3306/app"
            username = getEnv("DB_USER")
            password = getEnv("DB_PASSWORD")
        }
    }
}

二、Groovy与Java的深度关系

2.1 技术层面的集成机制

2.1.1 字节码级别的兼容性

Groovy和Java的集成不是简单的互操作,而是在字节码层面的深度融合:

Java源码 (.java)     Groovy源码 (.groovy)
      │                     │
      ▼                     ▼
   javac编译器          groovyc编译器
      │                     │
      ▼                     ▼
   Java字节码           Java字节码
      │                     │
      └─────────┬───────────┘
                ▼
            JVM执行

实际验证示例:

// Java类 - UserService.java
public class UserService {
    public String getUser(String id) {
        return "User-" + id;
    }
    
    public List<String> getUsers(String... ids) {
        return Arrays.asList(ids);
    }
}
// Groovy脚本直接使用Java类
def service = new UserService()
def user = service.getUser("123")
println user  // 输出: User-123

// 使用Java的可变参数
def users = service.getUsers("1", "2", "3")
users.each { println "用户: $it" }

// Groovy增强Java集合
users.findAll { it.startsWith("User-") }
     .collect { it.toUpperCase() }
     .each { println it }

2.1.2 类型系统的互通性

// Groovy中使用Java泛型
import java.util.Map
import java.util.List
import java.util.HashMap
import java.util.ArrayList

// 泛型集合的使用
Map<String, List<Integer>> dataMap = new HashMap<>()
dataMap.put("numbers", [1, 2, 3, 4, 5])

// Groovy语法糖与Java泛型结合
List<String> names = ["张三", "李四", "王五"]
Map<String, Integer> ageMap = [张三: 25, 李四: 30, 王五: 22]

// 与Java Stream API结合
names.stream()
     .filter { it.length() > 2 }
     .map { it.toUpperCase() }
     .forEach { println it }

2.1.3 注解的完全支持

// Java注解在Groovy中的使用
import org.springframework.stereotype.Service
import org.springframework.beans.factory.annotation.Autowired
import javax.validation.constraints.NotNull

@Service
class GroovyUserService {
    
    @Autowired
    UserRepository userRepository
    
    String createUser(@NotNull String name, int age) {
        // Groovy风格的实现
        def user = new User(name: name, age: age)
        userRepository.save(user)
        return "用户 ${name} 创建成功"
    }
}

2.2 开发体验对比

2.2.1 代码简洁性对比

// Java版本 - 数据处理
public class JavaDataProcessor {
    public List<String> processUserData(List<User> users) {
        List<String> result = new ArrayList<>();
        for (User user : users) {
            if (user.getAge() >= 18 && user.isActive()) {
                String processed = user.getName().toUpperCase() + 
                                 "-" + user.getAge();
                result.add(processed);
            }
        }
        Collections.sort(result);
        return result;
    }
}
// Groovy版本 - 相同功能
class GroovyDataProcessor {
    List<String> processUserData(List<User> users) {
        users.findAll { it.age >= 18 && it.active }
             .collect { "${it.name.toUpperCase()}-${it.age}" }
             .sort()
    }
}

// 更简洁的函数式风格
def processUserData = { users ->
    users.findAll { it.age >= 18 && it.active }
         .collect { "${it.name.toUpperCase()}-${it.age}" }
         .sort()
}

2.2.2 配置和DSL构建

// Java配置 - 冗长且不灵活
public class DatabaseConfig {
    private String url;
    private String username;
    private String password;
    private int maxPoolSize;
    
    public static DatabaseConfig create() {
        DatabaseConfig config = new DatabaseConfig();
        config.setUrl("jdbc:mysql://localhost:3306/mydb");
        config.setUsername("root");
        config.setPassword("password");
        config.setMaxPoolSize(10);
        return config;
    }
    
    // getter和setter方法...
}
// Groovy配置 - 简洁且灵活
class DatabaseConfig {
    String url
    String username  
    String password
    int maxPoolSize = 10
    
    static DatabaseConfig build(@DelegatesTo(DatabaseConfig) Closure closure) {
        def config = new DatabaseConfig()
        closure.delegate = config
        closure.resolveStrategy = Closure.DELEGATE_FIRST
        closure()
        return config
    }
}

// 使用DSL风格配置
def dbConfig = DatabaseConfig.build {
    url = "jdbc:mysql://localhost:3306/mydb"
    username = "root"
    password = System.getenv("DB_PASSWORD") ?: "password"
    maxPoolSize = 20
}

2.2.3 测试编写体验

// Java测试 - JUnit
@Test
public void testUserValidation() {
    // given
    User user = new User();
    user.setName("张三");
    user.setAge(25);
    user.setEmail("zhangsan@example.com");
    
    UserValidator validator = new UserValidator();
    
    // when
    ValidationResult result = validator.validate(user);
    
    // then
    assertTrue(result.isValid());
    assertEquals(0, result.getErrors().size());
}
// Groovy测试 - Spock框架
def "用户验证应该通过有效用户数据"() {
    given: "创建有效用户"
    def user = new User(
        name: "张三",
        age: 25, 
        email: "zhangsan@example.com"
    )
    def validator = new UserValidator()
    
    when: "执行验证"
    def result = validator.validate(user)
    
    then: "验证应该通过"
    result.valid
    result.errors.empty
}

def "用户验证应该拒绝无效数据"() {
    expect: "验证结果符合预期"
    validator.validate(user).valid == expectedValid
    
    where: "测试数据"
    user                                    || expectedValid
    new User(name: "", age: 25)            || false
    new User(name: "张三", age: -1)         || false
    new User(name: "张三", age: 25)         || true
}

2.3 性能特性分析

2.3.1 启动性能对比

// 性能测试代码
class PerformanceComparison {
    
    static void measureJavaPerformance() {
        long start = System.currentTimeMillis()
        
        // Java风格的代码
        List<Integer> numbers = new ArrayList<>()
        for (int i = 0; i < 1000000; i++) {
            numbers.add(i)
        }
        
        int sum = 0
        for (Integer number : numbers) {
            sum += number
        }
        
        long end = System.currentTimeMillis()
        println "Java风格耗时: ${end - start}ms, 结果: $sum"
    }
    
    static void measureGroovyPerformance() {
        long start = System.currentTimeMillis()
        
        // Groovy风格的代码
        def numbers = (0..<1000000).collect { it }
        def sum = numbers.sum()
        
        long end = System.currentTimeMillis()
        println "Groovy风格耗时: ${end - start}ms, 结果: $sum"
    }
    
    static void measureOptimizedGroovyPerformance() {
        long start = System.currentTimeMillis()
        
        // 优化后的Groovy代码
        @CompileStatic
        def calculateSum() {
            List<Integer> numbers = new ArrayList<>(1000000)
            for (int i = 0; i < 1000000; i++) {
                numbers.add(i)
            }
            
            int sum = 0
            for (Integer number : numbers) {
                sum += number
            }
            return sum
        }
        
        def sum = calculateSum()
        long end = System.currentTimeMillis()
        println "优化Groovy耗时: ${end - start}ms, 结果: $sum"
    }
}

2.3.2 运行时优化策略

// 1. 使用@CompileStatic提升性能
@CompileStatic
class OptimizedCalculator {
    static int fibonacci(int n) {
        if (n <= 1) return n
        return fibonacci(n - 1) + fibonacci(n - 2)
    }
}

// 2. 合理使用动态特性
class SmartProcessor {
    // 静态类型的核心计算逻辑
    @CompileStatic
    private int heavyComputation(int value) {
        // 大量计算...
        return value * value
    }
    
    // 动态特性用于灵活配置
    def processWithRule(data, Closure rule) {
        data.collect { item ->
            def computed = heavyComputation(item.value)
            rule(computed, item)
        }
    }
}

2.4 项目集成实践

2.4.1 混合项目结构

项目根目录/
├── src/
│   ├── main/
│   │   ├── java/           # Java源代码
│   │   │   └── com/example/
│   │   │       ├── service/
│   │   │       ├── controller/
│   │   │       └── repository/
│   │   ├── groovy/         # Groovy源代码
│   │   │   └── com/example/
│   │   │       ├── script/     # 动态脚本
│   │   │       ├── dsl/        # DSL定义
│   │   │       └── config/     # 配置类
│   │   └── resources/
│   └── test/
│       ├── java/           # Java测试
│       └── groovy/         # Groovy测试(Spock)
├── build.gradle            # Gradle构建脚本
└── settings.gradle

2.4.2 构建配置示例

// build.gradle
plugins {
    id 'java'
    id 'groovy'
    id 'org.springframework.boot' version '2.7.0'
}

dependencies {
    // Groovy依赖
    implementation 'org.apache.groovy:groovy:4.0.15'
    implementation 'org.apache.groovy:groovy-jsr223:4.0.15'
    
    // Spring Boot
    implementation 'org.springframework.boot:spring-boot-starter-web'
    
    // 测试依赖
    testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0'
    testImplementation 'org.spockframework:spock-spring:2.3-groovy-4.0'
}

// Groovy编译配置
compileGroovy {
    groovyOptions.configurationScript = file('config/groovy/config.groovy')
}

三、Groovy脚本的强大便利性

3.1 动态配置管理的革命性改进

3.1.1 传统Java配置的痛点

在传统Java开发中,配置管理往往面临以下问题:

// 传统Java配置方式的问题
public class TraditionalConfig {
    // 1. 配置硬编码,难以动态修改
    private static final String API_URL = "https://api.example.com";
    private static final int TIMEOUT = 5000;
    private static final boolean CACHE_ENABLED = true;
    
    // 2. 复杂配置需要大量样板代码
    public DatabaseConfig createDatabaseConfig() {
        DatabaseConfig config = new DatabaseConfig();
        config.setDriverClass("com.mysql.cj.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        config.setUsername("root");
        config.setPassword("password");
        config.setMaxPoolSize(10);
        config.setMinPoolSize(2);
        config.setConnectionTimeout(30000);
        return config;
    }
    
    // 3. 条件配置逻辑复杂
    public CacheConfig createCacheConfig(String environment) {
        CacheConfig config = new CacheConfig();
        if ("production".equals(environment)) {
            config.setProvider("redis");
            config.setHost("prod-redis.example.com");
            config.setPort(6379);
        } else if ("development".equals(environment)) {
            config.setProvider("memory");
            config.setMaxSize(1000);
        } else {
            throw new IllegalArgumentException("Unknown environment: " + environment);
        }
        return config;
    }
}

3.1.2 Groovy配置的优雅解决方案

// Groovy配置脚本 - config/application.groovy
environments {
    development {
        database {
            url = "jdbc:h2:mem:devDb"
            username = "sa"
            password = ""
            pool {
                maxSize = 5
                minSize = 1
            }
        }
        
        cache {
            provider = "memory"
            maxSize = 1000
            ttl = 3600  // 秒
        }
        
        api {
            baseUrl = "http://localhost:8080"
            timeout = 5000
            retryAttempts = 3
        }
    }
    
    production {
        database {
            url = "jdbc:mysql://${getEnv('DB_HOST')}:3306/${getEnv('DB_NAME')}"
            username = getEnv('DB_USER')
            password = getEnv('DB_PASSWORD')
            pool {
                maxSize = 20
                minSize = 5
            }
        }
        
        cache {
            provider = "redis"
            host = getEnv('REDIS_HOST')
            port = Integer.parseInt(getEnv('REDIS_PORT') ?: '6379')
            password = getEnv('REDIS_PASSWORD')
        }
        
        api {
            baseUrl = "https://api.production.com"
            timeout = 10000
            retryAttempts = 5
        }
    }
}

// 辅助方法
def getEnv(String key) {
    System.getenv(key) ?: System.getProperty(key)
}

// 动态功能开关
features {
    userRegistration = true
    premiumFeatures = environment == 'production'
    debugMode = environment == 'development'
    experimentalFeatures = getEnv('ENABLE_EXPERIMENTAL') == 'true'
}

// 复杂的业务规则配置
businessRules {
    userValidation = { user ->
        user.age >= 18 && 
        user.email?.contains('@') && 
        user.name?.length() >= 2
    }
    
    priceCalculation = { basePrice, userLevel, region ->
        def regionMultiplier = [
            'CN': 1.0,
            'US': 1.2,
            'EU': 1.15
        ][region] ?: 1.0
        
        def levelDiscount = [
            'VIP': 0.8,
            'PREMIUM': 0.9,
            'REGULAR': 1.0
        ][userLevel] ?: 1.0
        
        return basePrice * regionMultiplier * levelDiscount
    }
    
    notificationRules = [
        { user -> user.level == 'VIP' && user.lastLogin < Date.parse('yyyy-MM-dd', '2024-01-01') },
        { user -> user.orders.size() > 10 && !user.newsletter },
        { user -> user.birthday.month == new Date().month }
    ]
}

3.1.3 动态加载配置

// 配置管理器
class GroovyConfigManager {
    private GroovyShell shell = new GroovyShell()
    private Map configCache = [:]
    private long lastModified = 0
    
    /**
     * 动态加载配置文件
     */
    def loadConfig(String configPath) {
        File configFile = new File(configPath)
        
        // 检查文件是否更新
        if (configFile.lastModified() > lastModified) {
            lastModified = configFile.lastModified()
            
            // 重新加载配置
            def config = shell.evaluate(configFile)
            configCache.clear()
            configCache.putAll(config)
            
            println "配置文件已重新加载: $configPath"
        }
        
        return configCache
    }
    
    /**
     * 获取环境特定配置
     */
    def getEnvironmentConfig(String environment = 'development') {
        def config = loadConfig('config/application.groovy')
        return config.environments[environment]
    }
    
    /**
     * 动态执行业务规则
     */
    def executeBusinessRule(String ruleName, ...args) {
        def config = loadConfig('config/application.groovy')
        def rule = config.businessRules[ruleName]
        
        if (rule instanceof Closure) {
            return rule(*args)
        } else {
            throw new IllegalArgumentException("规则 '$ruleName' 不存在或不是可执行的闭包")
        }
    }
}

// 使用示例
def configManager = new GroovyConfigManager()

// 获取数据库配置
def dbConfig = configManager.getEnvironmentConfig('production').database
println "数据库URL: ${dbConfig.url}"

// 执行价格计算规则
def price = configManager.executeBusinessRule('priceCalculation', 100.0, 'VIP', 'CN')
println "计算后价格: $price"

// 验证用户
def user = [name: '张三', age: 25, email: 'zhang@example.com']
def isValid = configManager.executeBusinessRule('userValidation', user)
println "用户验证结果: $isValid"

3.2 动态表达式引擎

3.2.1 业务规则引擎的实现

/**
 * 强大的业务规则引擎
 */
class BusinessRuleEngine {
    
    /**
     * 用户权限验证规则
     */
    static def createPermissionRules() {
        return [
            // 基础权限规则
            canViewProfile: { user, targetUser ->
                user.id == targetUser.id || 
                user.role in ['ADMIN', 'MANAGER'] ||
                user.department == targetUser.department
            },
            
            // 操作权限规则  
            canDeletePost: { user, post ->
                user.id == post.authorId ||
                user.role == 'ADMIN' ||
                (user.role == 'MODERATOR' && post.reportCount > 5)
            },
            
            // 数据访问权限
            canAccessSensitiveData: { user, dataLevel ->
                def permissions = [
                    'PUBLIC': ['USER', 'MODERATOR', 'ADMIN'],
                    'INTERNAL': ['MODERATOR', 'ADMIN'], 
                    'CONFIDENTIAL': ['ADMIN']
                ]
                return user.role in permissions[dataLevel]
            },
            
            // 时间相关权限
            canPerformAction: { user, action, currentTime ->
                def timeRestrictions = [
                    'BATCH_OPERATION': { time -> 
                        def hour = time.hours
                        return hour >= 2 && hour <= 6  // 凌晨2-6点允许批量操作
                    },
                    'FINANCIAL_TRANSACTION': { time ->
                        def calendar = Calendar.getInstance()
                        calendar.time = time
                        return calendar.get(Calendar.DAY_OF_WEEK) in [Calendar.MONDAY..Calendar.FRIDAY]
                    }
                ]
                
                def restriction = timeRestrictions[action]
                return restriction ? restriction(currentTime) : true
            }
        ]
    }
    
    /**
     * 动态定价规则
     */
    static def createPricingRules() {
        return [
            // 基础定价
            calculateBasePrice: { product, quantity ->
                def basePrice = product.unitPrice * quantity
                
                // 批量折扣
                def discountRates = [
                    (1..10): 1.0,
                    (11..50): 0.95,
                    (51..100): 0.9,
                    (101..Integer.MAX_VALUE): 0.85
                ]
                
                def discount = discountRates.find { range, rate -> 
                    quantity in range 
                }?.value ?: 1.0
                
                return basePrice * discount
            },
            
            // VIP折扣
            applyVipDiscount: { basePrice, user ->
                def vipLevels = [
                    'BRONZE': 0.05,
                    'SILVER': 0.1, 
                    'GOLD': 0.15,
                    'PLATINUM': 0.2
                ]
                
                def discount = vipLevels[user.vipLevel] ?: 0
                return basePrice * (1 - discount)
            },
            
            // 季节性调整
            applySeasonalAdjustment: { price, product, date ->
                if (product.category == 'CLOTHING') {
                    def month = date.month + 1
                    if (month in [6, 7, 8]) {  // 夏季
                        return product.subCategory == 'SUMMER_WEAR' ? price * 1.2 : price * 0.8
                    } else if (month in [12, 1, 2]) {  // 冬季
                        return product.subCategory == 'WINTER_WEAR' ? price * 1.3 : price * 0.7
                    }
                }
                return price
            },
            
            // 地区调整
            applyRegionalAdjustment: { price, region ->
                def adjustments = [
                    'TIER1': 1.2,  // 一线城市
                    'TIER2': 1.1,  // 二线城市
                    'TIER3': 1.0,  // 三线城市
                    'RURAL': 0.9   // 农村地区
                ]
                return price * (adjustments[region] ?: 1.0)
            }
        ]
    }
    
    /**
     * 数据验证规则
     */
    static def createValidationRules() {
        return [
            // 用户数据验证
            validateUser: { user ->
                def errors = []
                
                if (!user.name || user.name.trim().empty) {
                    errors << "姓名不能为空"
                }
                
                if (!user.email || !user.email.matches(/^[\w\.-]+@[\w\.-]+\.\w+$/)) {
                    errors << "邮箱格式不正确"
                }
                
                if (user.age < 0 || user.age > 150) {
                    errors << "年龄必须在0-150之间"
                }
                
                if (user.phone && !user.phone.matches(/^1[3-9]\d{9}$/)) {
                    errors << "手机号格式不正确"
                }
                
                return errors.empty ? [valid: true] : [valid: false, errors: errors]
            },
            
            // 订单验证
            validateOrder: { order ->
                def errors = []
                
                if (!order.items || order.items.empty) {
                    errors << "订单必须包含至少一个商品"
                }
                
                order.items?.each { item ->
                    if (item.quantity <= 0) {
                        errors << "商品数量必须大于0"
                    }
                    if (item.price < 0) {
                        errors << "商品价格不能为负数"
                    }
                }
                
                if (order.totalAmount != order.items.sum { it.quantity * it.price }) {
                    errors << "订单总金额计算错误"
                }
                
                return errors.empty ? [valid: true] : [valid: false, errors: errors]
            },
            
            // 复杂业务验证
            validateBusinessLogic: { data, context ->
                def errors = []
                
                // 库存检查
                data.items?.each { item ->
                    def stock = context.stockService.getStock(item.productId)
                    if (stock < item.quantity) {
                        errors << "商品 ${item.productName} 库存不足,当前库存:${stock}"
                    }
                }
                
                // 促销活动检查
                if (data.promotionCode) {
                    def promotion = context.promotionService.getPromotion(data.promotionCode)
                    if (!promotion || promotion.expired) {
                        errors << "促销代码无效或已过期"
                    } else if (data.totalAmount < promotion.minAmount) {
                        errors << "订单金额未达到促销活动最低要求:${promotion.minAmount}"
                    }
                }
                
                return errors.empty ? [valid: true] : [valid: false, errors: errors]
            }
        ]
    }
}

3.3 与传统方案的优势对比

3.3.1 开发效率对比

// 传统Java方式处理数据的代码行数和复杂度
/*
Java版本大约需要:
- UserDataProcessor: ~150行代码
- SalesAnalyzer: ~200行代码  
- LogAnalyzer: ~180行代码
- 各种辅助类和方法: ~100行代码
总计: ~630行代码,需要多个类文件
*/

// Groovy版本:
/*
- DataProcessingUtils: ~200行代码
- 示例代码: ~100行代码
总计: ~300行代码,单个文件即可完成
代码量减少约50%,可读性和维护性显著提升
*/

3.3.2 灵活性对比

特性 传统Java Groovy脚本
配置修改 需要重新编译部署 直接修改脚本文件
业务规则调整 修改代码、测试、发布 修改配置脚本即可
数据处理逻辑 硬编码在类中 可动态加载脚本
复杂条件判断 大量if-else语句 简洁的闭包表达式
新功能添加 修改多个类文件 在配置中增加规则

小结

在本篇文章中,我们深入了解了Groovy语言的基础知识和核心特性,探讨了它与Java的深度关系,以及其在动态配置管理和业务规则引擎方面的强大便利性。

通过大量的代码示例和对比分析,我们可以看到Groovy为Java开发者带来的价值:

  • 简洁的语法:减少样板代码,提升开发效率
  • 动态特性:支持运行时修改和扩展
  • 无缝集成:与现有Java项目完美融合
  • 强大的表达能力:特别适合构建DSL和配置系统

这些特性使得Groovy成为构建动态代码执行引擎的理想选择,特别是在大模型AI应用蓬勃发展的今天,它为FunctionCall和**工具调用(MCP)**等场景提供了完美的解决方案。

下篇预告:在下篇文章中,我们将基于这些理论基础,动手实现一个功能完整的Java执行Groovy脚本万能工具类,包括:

  • 完整的工具类实现
  • 缓存机制和性能优化
  • 安全性控制和异常处理
  • 在大模型工具调用场景中的具体应用
  • 高级特性和最佳实践指南

敬请期待下篇的精彩内容!

1
0
1

评论区

加载评论中...
我的头像
Ctrl + Enter 快速发送