玖叶教程网

前端编程开发入门

「跟我重学android系列」2.一文升级java到kotlin

导读:自从2017年google宣布kotlin成为android开发第一语言后,很多android开发者转战kotlin。一般来讲,转换一门编程语言,有人欢喜有人忧,我们经常会看到好多程序员论坛评论 [学不动了],但实际上,那些想在IT行业往上爬的程序员早早的拥抱新技术。今天我们就来看下kotlin这门语言到底有多大变化。

提醒:篇幅太长,阅读大概需要10~13分钟

java转kotlin

目前kotlin最新稳定版1.3.72,已经相当完善了,这个时候去学习,也有很多资料,比如kotlincn,文档翻译很及时,学习起来也就轻松很多了。接下来,我们看下java转kotlin的基本用法

  • 变量声明

比如定义字符串a

java:

String a = "string";

kotlin:

var a : String = "string"

kotlin特有:

var a : String? = null // 可空
var a : String // 不可控,必须赋值,否则编译报错

因此,大家可以看出来,kotlin从语法、编译上已经杜绝了类型安全问题,按照kotlin的写法可以避免很多java中遇到的问题。

  • 类声明

比如定义个Student

java:

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;
  }
}

kotlin:

data class Student(val name: String, val age: Int)

可以看到,代码量只有一行,非常简洁

  • 方法声明

比如定义个main函数

java:

public static void main(String[] args)  {
	System.out.println(")
}

kotlin:

fun main(args: Array<String>) {
    println("Hello World")
}

这个差距不大

  • 接口定义

我们来看下例子

java:

interface MyInterface {
    void bar()
    default void foo() {  // java8 开始支持
      // 可选的方法体
    }
}

kotlin:

interface MyInterface {
    val prop: Int // 抽象的
    fun bar()
    fun foo() {
      // 可选的方法体
    }
}

区别:kotlin声明接口可以定义属性

  • 访问修饰符

访问修饰符基本差不太多,也比较简单

java:

支持default、private、public、protected

kotlin:

支持private、 protected、 internal 和 public,默认public

  • 匿名类

比如在android中给view设置点击事件

java:

// 方式一
btn.setOnClickListener(new View.OnClickListener(){
	void onClick(View v) {
  }
});
// 方式二(需要java8支持)
btn.setOnClickListener(view -> {

});

kotlin:

// 方式一
btn.setOnClickListener(object : View.OnClickListener {
  override fun onClick(v: View?) {
	}
})
// 方式二
btn.setOnClickListener { view -> 
            
}


kotlin常用特性

  • 属性委托
    • 延迟委托:by lazy { }
val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}

上面这个例子,当你使用lazyValue的时候才会执行大括号的内容,也就是打印computed!并返回Hello。在android中常用视图的延迟加载,对性能的调优有很大帮助。

    • 观察委托
class User {
    var name: String by Delegates.observable("init value") {
        prop, old, new ->
        println("$old -> $new")
    }
}

这个特性类似vue的观察者模式

  • 别名
typealias MyHandler = (Int, String, Any) -> Unit
  • 高阶函数

熟悉js的同学,这个就很好理解了,本质就是把函数当做参数传递

// 声明
fun play(cb: () -> Unit) {
  ...
}

// 调用
play {

}
  • super

支持指定父类

class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }

    override fun bar() {
        super<B>.bar()
    }
}

kotlin常用集合操作

  • list

java:

List<String> list = new ArrayList<String>();

kotlin:

var list = mutableListOf<String>()
  • map

java:

Map<String,Object> map = new HashMap<String,Object>();

kotlin:

var map = mutableMapOf<String, Any>()

kotlin增强语法糖

  • 字符串模板
var a = "hello "
var b = "kotlin"
var str = "$a$b" // hello kotlin
var str = """
$a$b
"""


  • 属性访问控制

共有getter,私有setter

var isPlay: Boolean = false
	private set
  • 常用内联函数:let、apply、also

kotlin中最常用的就是代码块,也就是{}语法,比如

play {
  
}

这种,让代码看起来简单了不少。

let:用来避免非空判断

var name: Stirng? = null

name?.let { name ->
// 这里name就一定不为null
}

apply:用来函数内部处理,处理完返回函数本身

TextView(context).apply {
  // 这里接收的是this,因此直接调用TextView的属性和方法即可
  text = "Hello"
}

also:

TextView(context).also {
  // 这里接收的是it
  it.text = "Hello"
}

kotlin在android中常犯的错

  • 获取java class
MainActivity::class.java
  • this使用
this@MainActivity

kotlin自定义扩展

比如:判断多个值非空

inline fun <R> notNull(vararg args: Any?, block: () -> R) {
  when (args.filterNotNull().size) {
    args.size -> block()
  }
}

总结

kotlin是一门基于JVM的新语言,100兼容现有JVM任何库,因此受到广泛尝试,android因为google的原因,超过一半的开发者已经在使用。当然kotlin提供了很多新特性,无形增加了学习成本,但是我相信在学习过程中,你会慢慢喜欢上她的。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言