You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从HashMap中调用函数?以调用Info.sendInfo函数为例

在Kotlin中通过HashMap调用函数的正确实现

你的代码目前存在核心问题:你并没有把函数存入Map,而是直接执行了函数并将返回的Unit类型结果存了进去,所以后续无法通过Map中的值调用目标函数。下面是修正方案:

问题分析

当前代码里的"!info" to Info.sendInfo(event)会立即执行Info.sendInfo(event),并把这个函数的返回值(Unit)作为Map的值存储。而Unit类型并没有runFunction方法,这会导致编译错误,同时也完全达不到“通过Map触发函数调用”的目的。

正确实现方式

我们需要把**函数本身(函数引用)**存入Map,而不是函数执行后的结果。具体步骤如下:

  1. 定义Map的类型为Map<String, (MessageReceivedEvent) -> Unit>,其中(MessageReceivedEvent) -> Unit表示“接收一个MessageReceivedEvent参数、返回Unit的函数类型”。
  2. 存入函数时,使用函数引用语法::Info.sendInfo(假设sendInfo是Info类中的伴生对象方法或顶层函数),不要加括号调用。
  3. 从Map中取出函数后,先判空避免空指针,再传入参数执行。

修正后的代码:

abstract class Listener : ListenerAdapter() {
    fun checkCommand(args: List<String>, event: MessageReceivedEvent) {
        // 定义存储函数引用的Map
        val commandMap: Map<String, (MessageReceivedEvent) -> Unit> = mapOf(
            "!info" to ::Info.sendInfo
        )
        
        // 取出函数并执行
        commandMap[args[0]]?.invoke(event)
    }
}

补充说明

  • 如果Info.sendInfo是实例方法(需要Info类的对象才能调用),那么你需要先持有Info的实例,然后用infoInstance::sendInfo作为函数引用存入Map。
  • 使用?.invoke(event)是安全调用:如果args[0]不在Map的键中,函数引用为null,此时不会执行任何操作,避免空指针异常。

内容的提问来源于stack exchange,提问作者paspielka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:45:38