是否可以从哈希映射运行函数?

pas*_*lka 0 function hashmap kotlin

如何从哈希映射运行函数。在本例中,我尝试运行 Info.sendInfo 函数。

abstract class Listener: ListenerAdapter() {
        fun checkCommand(args: List<String>, event: MessageReceivedEvent) {
            val map: Map<String, Unit> = mapOf(
                "!info" to Info.sendInfo(event)
            )
            
            map[args[0]].runFunction
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ten*_*r04 5

如果您想将函数作为值存储在映射中,则映射的值类型需要是该函数的定义,而不是Unit. 当您定义映射的条目时,您需要使用函数引用,其中涉及使用 lambda::或 lambda 来定义函数。您现在要做的就是在创建映射时立即调用该函数并将返回值存储在映射中。

对于这种情况,函数类型是一个以 aMessageReceivedEvent作为参数并返回 的函数Unit,它是一个(MessageReceivedEvent)->Unit函数,因此定义映射的代码应如下所示:

val map: Map<String, (MessageReceivedEvent)->Unit> = mapOf(
    "!info" to Info::sendInfo
)
Run Code Online (Sandbox Code Playgroud)

然后,要调用该函数,您可以像任何其他函数调用一样使用括号。但是,当您使用[]访问器时,映射会返回可为 null 的值,因为它们可能没有您提供的键的值。因此,您应该使用该getValue()函数而不是[],它断言您知道该值在映射中(否则它会引发异常),或者您可以使用空安全invoke调用。

// Value asserted, exception thrown if you're wrong
map.getValue(args[0])(event)

// Null safe call
map[args[0]]?.invoke(event)
Run Code Online (Sandbox Code Playgroud)