1,高级函数
Kotlin 使用类似 (Int) -> String 的一系列函数类型来处理函数的声明
还可以通过使用类型别名给函数类型起一个别称:
typealias ClickHandler = (Button, ClickEvent) -> Unit
lambda 表达式
{ a, b -> a + b },
匿名函数
fun(s: String): Int { return s.toIntOrNull() ?: 0 }
双冒号函数
函数调用 f.invoke(params) 或者 f(params)
2,内联函数 与禁用内联
inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) { …… }
val foo: Foo
inline get() = Foo()
var bar: Bar
get() = ……
inline set(v) { …… }
inline var bar: Bar
get() = ……
set(v) { …… }
3, 解构
当一个对象的属性明确的时候,可以对其进行封装和解构
data class Result(val result: Int, val status: Status)
fun function(……): Result {
// 各种计算
return Result(result, status)
}
// 现在,使用该函数:
val (result, status) = function(……)
或者
for ((key, value) in map) {
// 使用该 key、value 做些事情
}
如
val (name, age) = person
// 解构后代码
val name = person.component1()
val age = person.component2()
4,注解
- @Target 指定可以用该注解标注的元素的可能的类型(类、函数、属性、表达式等);
- @Retention 指定该注解是否存储在编译后的 class 文件中,以及它在运行时能否通过反射可见 (默认都是 true);
- @Repeatable 允许在单个元素上多次使用相同的该注解;
- @MustBeDocumented 指定该注解是公有 API 的一部分,并且应该包含在生成的 API 文档中显示的类或方法的签名中。
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class Fancy
@Fancy class Foo {
@Fancy fun baz(@Fancy foo: Int): Int {
return (@Fancy 1)
}
}
class Example(@field:Ann val foo, // 标注 Java 字段
@get:Ann val bar, // 标注 Java getter
@param:Ann val quux)
@file:JvmName("Foo")
package org.jetbrains.demo
支持的使用处目标的完整列表为:
-- file;
-- property(具有此目标的注解对 Java 不可见);
-- field;
-- get(属性 getter);
-- set(属性 setter);
-- receiver(扩展函数或属性的接收者参数);
-- param(构造函数参数);
-- setparam(属性 setter 参数);
-- delegate(为委托属性存储其委托实例的字段)。
5,反射
val c = MyClass::class
// 请注意,Kotlin 类引用与 Java 类引用不同。要获得 Java 类引用, 请在 KClass 实例上使用 .java
// 属性。
val predicate: (String) -> Boolean = ::isOdd // 引用到 isOdd(x: String)
// 属性引用
val x = 1
fun main() {
println(::x.get())
println(::x.name)
}
// 表达式 ::x 求值为 KProperty<Int> 类型的属性对象,它允许我们使用 get() 读取它的值,或者使用
// name 属性来获取属性名。
网友评论