在Kotlin中通过引用调用Action

时间:2017-09-10 19:12:04

标签: kotlin

我有一个(键,值)的Map,其中值是预定义的函数。 我想迭代Mp中的输入参数并检查键与输入参数匹配的位置,然后调用等效函数,如this

我的代码需要如下所示:

fun fn1: Unit {           // using Unit is optional
    println("Hi there!")
}

fun fn2 {        
    println("Hi again!")
}

fun MainFun(x: int){
val map: HashMap<Int, String> = hashMapOf(1 to fn1, 2 to fn2)

for ((key, value) in map) {
     // if key = x then run/invoke the function mapped with x, for example if x = 1 then invoke fn1
}

}

注意:我读过类似下面的内容,但不知道如何使用它们:

inline fun <K, V> Map<out K, V>.filter(
    predicate: (Entry<K, V>) -> Boolean
): Map<K, V> (source)

val russianNames = arrayOf("Maksim", "Artem", "Sophia", "Maria", "Maksim")
val selectedName = russianNames
      .filter { it.startsWith("m", ignoreCase = true) }
      .sortedBy { it.length }
      .firstOrNull()

2 个答案:

答案 0 :(得分:1)

fun fn1() {
    println("Hi there!")
}

fun fn2() {
    println("Hi again!")
}    

fun main(args: Array<Int>){
    val map = hashMapOf(1 to ::fn1, 2 to ::fn2)
    map.forEach { key, function -> function.invoke()  }
}

这将完成工作,但您的代码甚至没有正确的语法。你应该先学习基础知识。

答案 1 :(得分:1)

嗨,我希望这会对你有帮助。

fun fn1() {
    println("Hi there!")
}

fun fn2() {
    println("Hi again!")
}

fun main(args: IntArray){
    val map = hashMapOf(
            1 to ::fn1,
            2 to ::fn2)
    map.filterKeys { it == args[0] }     // filters the map by comparing the first int arg passed and the key
            .map { it.value.invoke() }   // invoke the function that passed the filter.
}

如果keyRegEx,则map.filterKeys { Regex(it).matches(x) }可以使用,Try Kotlin下方的完整示例:

data class Person(val name: String,
                  val age: Int? = null)

val persons = listOf(Person("Alice"),
                     Person("Bob", age = 23))

fun old() {
    val oldest = persons.maxBy { it.age ?: 0 }
    println("The oldest is: $oldest")
}

fun young() {
    val youngest = persons.minBy { it.age ?: 0 }
    println("The youngest is: $youngest")
}

fun selection(x: String) { 

   val map = mapOf(
            "old|big" to ::old,
            "new|young" to ::young)
    map.filterKeys { Regex(it).matches(x) } 
            .map { it.value.invoke() }   
}

fun main(args: Array<String>) {   

    selection("new")
}