首发于公众号: 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
。
Kotlin学习笔记之 13 基础操作符run、with、let、also、apply