分类目录归档:kotlin

kotlin注解


注解声明

注解是一种将元数据附加到代码中的方法。声明注解需要在类前面使用 annotation 关键字:

annotation class fancy

用法

@fancy class Foo {
    @fancy fun baz(@fancy foo: Int): Int {
        return (@fancy 1)
    }
}

在多数情形中 @ 标识是可选的。只有在注解表达式或本地声明中才必须:

fancy class Foo {
    fancy fun baz(fancy foo: Int): Int {
        @fancy fun bar() {...

阅读全文...

Kotlin使用Maven


插件和版本

Kotlin-maven-plugin 可以编译 Kotlin 资源和模块。现在只有 Maven V3 支持

通过 Kotlin.version 定义你想要的 Kotlin 版本。可以有以下的值

X.Y.SNAPSHOT:对应版本 X.Y 的快照,在 CI 服务器上的每次成功构建的版本。这些版本不是真正的稳定版,只是推荐用来测试新编辑器的功能的。现在所有的构建都是作为 0.1-SNAPSHOT 发表的。

X.Y.X: 对应版本 X.Y.Z 的 release 或 milestone ,自动升级。它们是文件构建。Release 版本发布在 Maven Central 仓库。在 ...

阅读全文...

kotlin使用 Gradle


插件和版本

kotlin-gradle-plugin 可以编译 Kotlin 文件和模块

X.Y.SNAPSHOT:对应版本 X.Y 的快照,在 CI 服务器上的每次成功构建的版本。这些版本不是真正的稳定版,只是推荐用来测试新编辑器的功能的。现在所有的构建都是作为 0.1-SNAPSHOT 发表的。

X.Y.X: 对应版本 X.Y.Z 的 release 或 milestone ,自动升级。它们是文件构建。Release 版本发布在 Maven Central 仓库。在 pom 文件里不需要多余的配置。

milestone 和 版本的对应关系如下:

Milestone Versio...

阅读全文...

kotlin使用 Ant


获得 Ant 任务

Kotlin 提供了 Ant 三个任务:

kotlinc : Kotlin 面向 JVM 的编译器

kotlin2js: 面向 javaScript 的编译器

withKotlin: 使用标准 javac Ant 任务时编译 Kotlin 文件的任务

这些任务定义学在 kotlin-ant.jar 标准库中,位与 kotlin compiler 的 lib 文件夹下

面向 JVM 的只有 kotlin 源文件任务

当项目只有 kotlin 源文件时,最简单的方法就是使用 kotlinc 任务:

<project name="Ant Task Test" def...

阅读全文...

Kotlin与Java交互


Kotlin 在设计时就是以与 java 交互为中心的。现存的 java 代码可以在 kotlin 中使用,并且 Kotlin 代码也可以在 java 中流畅运行。这节我们会讨论在 kotlin 中调用 java 代码。

在 kotlin 中调用 java 代码

基本所有的 Java 代码都可以运行

import java.util.*
fun demo(source: List<Int>) {
    val list = ArrayList<Int>()
    for (item in source )
        list.add(item)
    ...

阅读全文...

kotlin内联函数


使用高阶函数带来了相应的运行时麻烦:每个函数都是一个对象,它捕获闭包,即这些变量可以在函数体内被访问。内存的分配,虚拟调用的运行都会带来开销

但在大多数这种开销是可以通过内联文本函数避免。下面就是一个很好的例子。lock() 函数可以很容易的在内联点调用。思考一下下面的例子:

lock(i) { foo() }

(Instead of creating a function object for the parameter and generating a call),编译器可以忽略下面的代码:

lock.lock()
try {
    foo()
}
finally {
    l...

阅读全文...

kotlin高阶函数与 lambda 表达式


高阶函数

高阶函数就是可以接受函数作为参数或者返回一个函数的函数。比如 lock() 就是一个很好的例子,它接收一个 lock 对象和一个函数,运行函数并释放 lock;

fun <T> lock(lock: Lock, body: () -> T ) : T {
    lock.lock()
    try {
        return body()
    }
    finally {
        lock.unlock()
    }
}

现在解释一下上面的代码吧:body 有一个函数类型 () -> T,把它设想为没有参数并返回 T 类型的函...

阅读全文...

kotlin函数


函数声明

在 kotlin 中用关键字 fun 声明函数:

fun double(x: Int): Int {

}

函数用法

通过传统的方法调用函数

val result = double(2)

通过.调用成员函数

Sample().foo() // 创建Sample类的实例,调用foo方法

中缀符号

在满足以下条件时,函数也可以通过中缀符号进行调用:

 它们是成员函数或者是扩展函数  只有一个参数 使用infix关键词进行标记

//给 Int 定义一个扩展方法
infix fun Int.shl(x: Int): Int {
...
}

1 shl 2 //用中缀注解调用...

阅读全文...

Kotlin代理属性


Kotlin 很多常用属性,虽然我们可以在每次需要的时候手动实现它们,但更好的办法是一次实现多次使用,并放到库里。比如:

延迟属性:只在第一次访问时计算它的值。 可观察属性:监听者从这获取这个属性更新的通知。 在 map 中存储的属性,而不是为每个属性创建一个字段。

为了满足这些情形,Kotllin 支持代理属性:

class Example {
    var p: String by Delegate()
}

语法结构是: val/var <property name>: <Type> by <expression> 在 by 后面的表达式就是...

阅读全文...

kotlin代理


类代理

代理模式给实现继承提供了很好的代替方式, Kotlin 在语法上支持这一点,所以并不需要什么样板代码。Derived 类可以继承 Base 接口并且指定一个对象代理它全部的公共方法:

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { printz(x) }
}

class Derived(b: Base) : Base by b

fun main() {
    val b = BaseImpl(10)
    Derived(b...

阅读全文...