如何制作和使用函数数组列表

时间:2018-11-08 18:38:39

标签: arraylist kotlin

如何创建函数数组列表,并轻松调用每个函数?我已经尝试过制作ArrayList<Function<Unit>>,但是当我尝试这样做时:

functionList.forEach { it }

这:

for(i in 0 until functionList.size) functionList[i]

当我尝试执行以下操作:it()和以下操作:functionList[i]()时,它甚至无法在intellij中编译。如何在Kotlin中做到这一点?另外,ArrayList<Function<Unit>>中的“单位”是指返回值还是参数?

2 个答案:

答案 0 :(得分:3)

就像这样:

val funs:List<() -> Unit> = listOf({}, { println("fun")})
funs.forEach { it() }

编译器可以在此处成功推断funs的{​​{1}}的类型。请注意,List<() -> Unit>是Kotlin中的函数类型,表示不带任何参数并返回() -> Unit的函数。

答案 1 :(得分:2)

我认为此处使用Function接口存在两个问题。

第一个问题是,这并不意味着您可能会想。据我了解,它是一个非常通用的接口,由 all 函数实现,无论它们采用多少参数(或不采用任何参数)。因此它没有任何invoke()方法。这就是编译器所抱怨的。

Function有几个子接口,每个子接口一个(即每个参数数量一个):Function0表示不带参数的功能,Function1表示带参数的功能一个参数,依此类推。 这些具有适当的invoke()方法。因此,您可以通过将Function替换为Function0来解决此问题。

但是,这引出了我的第二个问题,那就是不应该以这种方式使用Function接口。我认为它们主要是为了实现Java兼容性和/或供编译器内部使用。

通常最好将Kotlin语法用于函数类型:(P1, P2...) -> R。这更容易阅读,并且避免了这类问题。

因此,真正的答案可能是将Function<Unit>替换为() -> Unit

此外,如果不清楚,则Kotlin没有void类型。相反,它具有一个名为Unit的类型,该类型只有一个值。这可能看起来很奇怪,但是在类型系统中更有意义,因为它使编译器将没有显式值返回的函数与没有显式值的函数区分开。 (后者可能总是抛出异常或退出进程。可以将它们定义为返回Nothing -一种根本没有值的类型。)