首发于公众号: DSGtalk1989
26.反射
-
函数引用
我们用
::加上函数名的方式表示函数的引用。我们有这样一个需求,结合我们上面说过的高阶函数,高阶函数通常和面需要传入的是一个函数。就比如
List类的filter这个高级函数。public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { return filterTo(ArrayList<T>(), predicate) }可以看到,需要传入一个
(T) -> Boolean的函数,那么比如我们自己有定义过这样一个函数。fun isOdd(x: Int) = x % 2 != 0传入的是
Int类型,得到的是推断出来的Boolean类型,符合上面说的(T) -> Boolean类型,这个时候我们如何把这个isOdd方法传入给高阶函数呢,就要使用到函数的引用。val numbers = listOf(1, 2, 3) println(numbers.filter(::isOdd)) -
::引用对应的对象类引用对应的是
MyClass::class -> KClass方法引用对应的是
::myFun -> KFunction<out R>val属性引用对应的是::valproperty -> KProperty,可以调用get()方法,可以获得name属性。var属性引用对应的是::varProperty -> KMutableProperty,除了get()方法和name属性之外还可以调用set()方法针对类中的属性引用,使用的是
MyClass::property。