导读:自从2017年google宣布kotlin成为android开发第一语言后,很多android开发者转战kotlin。一般来讲,转换一门编程语言,有人欢喜有人忧,我们经常会看到好多程序员论坛评论 [学不动了],但实际上,那些想在IT行业往上爬的程序员早早的拥抱新技术。今天我们就来看下kotlin这门语言到底有多大变化。 提醒:篇幅太长,阅读大概需要10~13分钟 目前kotlin最新稳定版1.3.72,已经相当完善了,这个时候去学习,也有很多资料,比如kotlincn,文档翻译很及时,学习起来也就轻松很多了。接下来,我们看下java转kotlin的基本用法 比如定义字符串a java: kotlin: kotlin特有: 因此,大家可以看出来,kotlin从语法、编译上已经杜绝了类型安全问题,按照kotlin的写法可以避免很多java中遇到的问题。 比如定义个Student java: kotlin: 可以看到,代码量只有一行,非常简洁 比如定义个main函数 java: kotlin: 这个差距不大 我们来看下例子 java: kotlin: 区别:kotlin声明接口可以定义属性 访问修饰符基本差不太多,也比较简单 java: 支持default、private、public、protected kotlin: 支持private、 protected、 internal 和 public,默认public 比如在android中给view设置点击事件 java: kotlin: 上面这个例子,当你使用lazyValue的时候才会执行大括号的内容,也就是打印computed!并返回Hello。在android中常用视图的延迟加载,对性能的调优有很大帮助。 这个特性类似vue的观察者模式 熟悉js的同学,这个就很好理解了,本质就是把函数当做参数传递 支持指定父类 java: kotlin: java: kotlin: 共有getter,私有setter kotlin中最常用的就是代码块,也就是{}语法,比如 这种,让代码看起来简单了不少。 let:用来避免非空判断 apply:用来函数内部处理,处理完返回函数本身 also: 比如:判断多个值非空 kotlin是一门基于JVM的新语言,100兼容现有JVM任何库,因此受到广泛尝试,android因为google的原因,超过一半的开发者已经在使用。当然kotlin提供了很多新特性,无形增加了学习成本,但是我相信在学习过程中,你会慢慢喜欢上她的。java转kotlin
String a = "string";
var a : String = "string"
var a : String? = null // 可空
var a : String // 不可控,必须赋值,否则编译报错
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
data class Student(val name: String, val age: Int)
public static void main(String[] args) {
System.out.println(")
}
fun main(args: Array<String>) {
println("Hello World")
}
interface MyInterface {
void bar()
default void foo() { // java8 开始支持
// 可选的方法体
}
}
interface MyInterface {
val prop: Int // 抽象的
fun bar()
fun foo() {
// 可选的方法体
}
}
// 方式一
btn.setOnClickListener(new View.OnClickListener(){
void onClick(View v) {
}
});
// 方式二(需要java8支持)
btn.setOnClickListener(view -> {
});
// 方式一
btn.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
}
})
// 方式二
btn.setOnClickListener { view ->
}
kotlin常用特性
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
class User {
var name: String by Delegates.observable("init value") {
prop, old, new ->
println("$old -> $new")
}
}
typealias MyHandler = (Int, String, Any) -> Unit
// 声明
fun play(cb: () -> Unit) {
...
}
// 调用
play {
}
class D : A, B {
override fun foo() {
super<A>.foo()
super<B>.foo()
}
override fun bar() {
super<B>.bar()
}
}
kotlin常用集合操作
List<String> list = new ArrayList<String>();
var list = mutableListOf<String>()
Map<String,Object> map = new HashMap<String,Object>();
var map = mutableMapOf<String, Any>()
kotlin增强语法糖
var a = "hello "
var b = "kotlin"
var str = "$a$b" // hello kotlin
var str = """
$a$b
"""
var isPlay: Boolean = false
private set
play {
}
var name: Stirng? = null
name?.let { name ->
// 这里name就一定不为null
}
TextView(context).apply {
// 这里接收的是this,因此直接调用TextView的属性和方法即可
text = "Hello"
}
TextView(context).also {
// 这里接收的是it
it.text = "Hello"
}
kotlin在android中常犯的错
MainActivity::class.java
this@MainActivity
kotlin自定义扩展
inline fun <R> notNull(vararg args: Any?, block: () -> R) {
when (args.filterNotNull().size) {
args.size -> block()
}
}
总结