buildscript {
ext.kotlin_version = '1.0.0'
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'me.tatarka.retrolambda'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
- 推薦安裝Kotlin Extensions For Android
Lambda
- 通過表達式代替
@Functionalinterface
(只包含一個方法的接口) - 如果主體只有一條語句毅访,可省略
{}
、return
喻粹、語句后面的;
// 參數(shù)類型可寫可不寫
view.setOnClickListener((view) -> {});
基礎(chǔ)
變量
變量名在前,變量類型在后
如果聲明的時候賦值了就不用指定類型草巡,會自動類型推導(dǎo)
-
val(final 常量)
val a : Int = 1 // final int a = 1;
-
變量默認都是
@NotNull
的,在類型后面加上?
可以指定為@Nullable
var b = 1 // int b = 1; var s : String? // 可以為null
可以return null的函數(shù)查乒,其返回類型都要加上?
數(shù)組
類型安全
-
is
用于類型判斷,相當(dāng)于instanceof
fun getStringLength(obj: Any) : Int? { if (obj is String) { // is判斷內(nèi)自動轉(zhuǎn)為String類型郁竟,不需要強轉(zhuǎn) return obj.length } // 離開類型判斷分支后,仍然是Any類型 return null; }
-
字符串模版(EL表達式)
"Hello ${name}"
-
if else替代三目運算符
fun max(a : Int, b :Int) : Int? = if (a > b) a else b
函數(shù)
-
如果函數(shù)返回Unit類型憔晒,可以忽略掉
fun main(args : Array<String>): Unit { // String[] println("hello world!"); // 分號可以省略 }
-
函數(shù)體只有一個表達式時可省略括號,返回值自動自動推斷
fun sum(a : Int, b : Int) = a + b;
相等
-
引用相等
a === b // a.identityEqual(b)
-
結(jié)構(gòu)相等
a == b // a?.equals(b) ?: b === null
For
-
in
等價于foreachfor ((k, v) in map) { println("$k -> $v") }
-
indices
下標(biāo)索引fun main(args : Array<String>) { for(i in args.indices) { print(args[i]) } }
-
sizei()
fun main(args : Array<String>) { var i = 0 while(i < args.size()) { print(args[i++]) } }
OOP
默認都是
final
類-
package import和java一致,如果出現(xiàn)導(dǎo)入報名沖突可以使用
as
import foo.Bar import bar.Bar as bBar
構(gòu)造函數(shù)
-
主構(gòu)造函數(shù)只有一個嘹屯,是類頭的一部分跟在類名后面
-
主構(gòu)造函數(shù)的參數(shù)
class Person (firstName: String) { init {} // 主構(gòu)造函數(shù)初始化代碼 } // 等價于 public final class Person { public Person(String name) { // init{} } }
-
主構(gòu)造函數(shù) + 屬性
class Person(val name: String, var age: Int) {} // 等價于 public final class Person { private final String name; private int age; public Person(@NotNull String name, int age) {} // getter setter }
如果一個類沒有聲明任何構(gòu)造函數(shù),將會生成一個不帶參數(shù)的主構(gòu)造函數(shù)
-
-
二級構(gòu)造函數(shù)州弟,使用constructor
class Person(val name: String) { constructor(name: String, parent: Person): this(name) {} }
-
創(chuàng)建實例:沒有<del>
new
</del>關(guān)鍵字低零,直接調(diào)用構(gòu)造函數(shù)val person = Pserson("ss");
屬性
要使用屬性只需要使用名稱引用即可,就相當(dāng)于java中的public
字段
繼承:
所有類的共同父類Any
掏婶,不屬于java.lang.Object
,沒有任何成員變量雄妥,甚至沒有equals()
、hashCode()
依溯、toString()
普通類
-
繼承的類有主構(gòu)造函數(shù)
open class Base(p: Int) {} class Derived(p: Int) : Base(p) {}
-
沒有主構(gòu)造函數(shù),那么每個二級構(gòu)造函數(shù)使用
super
或者委托給另一個構(gòu)造函數(shù)class MyView : View { constructor(context: Context) : super(context) { } constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { } }
- 父類的函數(shù)必標(biāo)注
open
(去掉java中的final關(guān)鍵字)否則子類不允許定義同名函數(shù)枝秤;因此父類類頭上也要標(biāo)注open
- 函數(shù)必須加上
override
標(biāo)注才能重寫父類方法
抽象類 & 接口
單例
object SDKFactory {
fun say(name : String) {
println("hello ${name}")
}
}
SDKFactory.say("CatDog") // SDKFactory.INSTANCE.say("CatDog")
public final class SDKFactory {
public static final SDKFactory INSTANCE;
private SDKFactory() {
INSTANCE = (SDKFactory)this;
}
static {
new SDKFactory();
}
public final void say(@NotNull String name) {
// ..
}
}