Java to Kotlin

Wafer Li ... 2017-03-17 Kotlin
  • Kotlin
  • 语言之路
小于 1 分钟

# 1. 概述

下面总结一些代码段,用于帮助从 Java 迁移到 Kotlin

# 2. Lazy Initialization

// Java

private A a = null;

public A getA() {
    if (a == null) {
        a = initA();
    }

    return a;
}

private A initA() {
    // ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Kotlin

val a: A by lazy { initA() }

private fun initA(): A {
    // ...
}
1
2
3
4
5
6
7

# 3. App.getContext()

// Java

class App extends Application {
    private Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();

        context = getAppContext();
    }

    public Context getContext() {
        retrun context;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Kotlin

class App : Application() {
    conpanion object {
        lateinit var context: Context
        private set
    }

    override fun onCreate() {
        context = applicationContext
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

或者也可以直接扩展 Context

val Context.myApp: MyApp
        get() = applicationContext as MyApp
1
2

# 4. it in lambda

当实现的接口是单方法接口时,Kotlin 会自动使用 lambda 来代替; 这时候很容易出现不知道怎么写的问题。

此时,放心大胆的用 it 这个内置的 lambda 表达式参数。

// Java

button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        // Perform action on click
    }
});
1
2
3
4
5
6
7
8
// Kotlin

button.setOnClickListener { it -> // it is a view
    // Perform action on click
}
1
2
3
4
5

需要注意的是 lambda 是表达式,默认返回值为最后执行函数的返回值或者字面量; 不需要 return 关键字。

# 5. Functional Read From StdIn

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))

    reader.lines().forEach(::println)
}
1
2
3
4
5