Android中的swift之kotiln

来源:互联网 发布:不败传说冰川网络 编辑:程序博客网 时间:2024/06/05 07:50

首先先了解一下什么是kotiln?
Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。
Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。
JetBrains,作为目前广受欢迎的Java IDE IntelliJ 的提供商,在 Apache 许可下已经开源其Kotlin 编程语言。
Kotlin已正式成为Android官方支持开发语言。

那么kotiln与Java相比有什么优势呢?
Kotlin编译为JVM字节码或JavaScript - 像Java一样,Bytecode也是Kotlin程序的编译格式。 字节码表示编程代码,一旦编译,就通过虚拟机而不是计算机的处理器运行。 通过使用这种方法,一旦编译并运行虚拟机,源代码就可以在任何平台上运行。 一旦kotlin程序被转换为字节码,它可以通过网络传输并由JVM(Java虚拟机)执行。

Kotlin程序可以使用所有现有的Java框架和库 - 是的,Kotlin程序可以使用所有现有的Java框架和库,甚至依赖于注释处理的高级框架也是如此。关于kotlin语言的主要重点是它可以轻松地与Maven的,摇篮和其他构建系统集成。
Kotlin可以轻松学习,平易近人。通过简单的阅读语言参考可以轻松学习。语言干净直观(易于使用和理解)。Kotlin看起来很像Scala,但更简单。
Kotlin是开放源码,没有收费。
将Java自动转换为Kotlin - JetBrains将IntelliJ集成了一个新功能,将Java转换为Kotlin,节省了大量的时间。而且它也节省了我们重新编写世代代码。
Kotlin的空安全性很好 - 现在摆脱NullPointerExceptions。这种类型的系统帮助我们避免空指针异常。在Kotlin系统中,系统只拒绝编译尝试分配或返回null的代码考虑以下示例 -
代码审查不是问题 - 科特林更注重可读性的语法,所以代码审查不是一个问题,它们仍然可以由那些不熟悉语言的团队成员完成。

最后让我们来看看Kotlin 基本语法

先说个学习Kotlin语法的小窍门,将代码用Java写好,然后Code/Conver Java File to Kotlin File转换成Kotlin代码,或者将Java代码复制到Kotlin文件会提示转换也是挺方便的,比较差异很容易就能理解了,一开始难免不适应习惯后相信你一定会喜欢上Kotlin

1). 定义

忘掉Java的那一套写法不然会很不适应的,Kotlin有自己的特性不该被Java的思维所束缚。在Kotlin中常量用val声明,变了用var声明,关键字在前面,类型以冒号:隔开在后面,也可以省略直接赋值,类型后带问号?表示可为空类型(默认空安全)。
常量val延迟加载by lazy{},默认线程安全关闭线程安全lazy(LazyThreadSafetyMode.NONE){},变量var延迟加载lateinit。

//常量数组int[][][] arrs = new int[3][2][1];
val arrs = Array(3) { Array(2) { IntArray(1) } }
//空安全变量
var str: String = “hello”
var str1 = “word”
//可为空字符串变量
var str2: String? = null

2). 条件

if…else 正常使用,不过移除了switch用更强大的when替代,when子式可以是常量、变量、返回数值的表达式、返回Boolean值的表达式,强大到用来替换if…else if

// 测试值 x = 0, -1, 1, 2, 3, 6, 10
var x = 10
when (x) {
//常量
2 -> println(“等于2”)
//数值表达式
if (x > 0) 1 else -1 -> println(“大于0并等于1,或小于0并等于-1”)
//Boolean类型表达式
in 1..5 -> println(“范围匹配1-5”)
!in 6..9 -> println(“不是6-9”)
is Int -> println(“类型判断”)
else -> println(“else”)
}
// 代替if…else if
when{
x > 6 && x <= 10 -> println(“大于6小于等于10”)
x < 6 -> println(“小于6”)
else -> println(“else”)
}
3). 循环

while 和 do…while 同Java并无区别,for则有很大改变并多出了几个变种

val list = arrayListOf(“aa”, “bb”, “cc”)
//递增for (int i = 0; i < list.size(); i++)
for (i in list.indices) {
print(list[i])
}
//递增for (int i = 2; i < list.size(); i++)
for (i in 2..list.size-1) {
print(list[i])
}
//递减for (int i = list.size() - 1; i >= 0; i–)
for (i in list.size - 1 downTo 0) {
print(list[i])
}
//操作列表内的对象
for (item in list) {
print(item)
}
//加强版
for((i, item) in list.witnIndex()) {
print(list[i])
print(item)
}
//变种版
list.forEach {
print(it)
}

list.forEach {
print(it)
}

list.forEachIndexed { i, s ->
print(list[i])
print(s)
}

list.forEachIndexed(object :(Int,String) -> Unit{
override fun invoke(i: Int, s: String) {
print(list[i])
print(s)
}
})
万能的冒号

在Kotlin中冒号:用万能来称呼绝不为过。常量变量的类型声明,函数的返回值,类的继承都需要它

//val表示常量var表示变量声明
val name: String = “tutu”
//省略类型说明
var age = “23”
//fun表示函数
fun getName(): String{
return “tutu”
}
//类继承
class UserList(): ArrayList() {
//…
}

除此之外还有一个特别的地方也需要它,使用Java类的时候。Kotlin最终会还是编译成Java字节码,使用到Java类是必然的,在Kotlin语法如下

val intent = Intent(this, MainActivity::class.java)

类名::class.java没有为什么就这么写记着就是

我是谁的@

除了冒号另一个重要符号@,想必用到内部类和匿名内部类的地方一定很多,再加上支持lambda语法,没有它谁告诉你this和return指的是哪一个

class User {
inner class State{
fun getUser(): User{
//返回User
return this@User
}
fun getState(): State{
//返回State
return this@State
}
}
}

偷懒的方法

1). Kotlin特色
Java的getter/setter方法自动转换成属性,对应到Kotlin属性的调用

public class User {
private String name;
private String age;

public String getName() {    return name;}public void setName(String name) {    this.name = name;}public String getAge() {    return age;}public void setAge(String age) {    this.age = age;}

}

反之Kotlin的属性自动生成Java的getter/setter方法,方便在Java中调用,同样的定义在Kotlin中

class User {
var name: String? = null
var age: String? = null
}

这样一个Java类在Kotlin中只需这样调用

val user = User()
//赋值
user.name = “tutu”
user.age = “23”
//取值
val name = user.name
val age = user.age

我们的getter/setter方法有时不会这么简单,这就需要自定义getter/setter了,另起一行设置get()/set(value)方法,实现一个Java中常用的单例,这里只为了展示,单例在Kotlin有更简单的方法实现,只要在 package 级别创建一个 object 即可

class User {
companion object {
@Volatile var instance: User? = null
get() {
if (field == null) {
synchronized(User::class.java) {
if (field == null)
field = User()
}
}
return field
}
}

var name: String? = nullvar age: String? = null

}

自定义getter/setter重点在field,跟我们熟悉所Java的this指代当前类一样,field指代当前参数,直接使用参数名instance代替不会报错但单例就没效果了

2). 字符串模板
在Java中拼接字符串的代码可读性都很差,在Kotlin字符串拼接变得非常简洁,只需用$后面加上参数名,复杂的参数要加上{}

val user = User()
//赋值
user.name = “tutu”
user.age = “23”
//取值
val name = user.name
val age = user.age
var userInfo = “name:user.name,age:age”
//输出结果:name:tutu, age:23

3). lambda
一开始觉得lambda很高级完全看不懂,其实很简单的就是把接口名、方法名和参数类型省掉不写再加个->罢了,明白这点了很好理解。

// 无参数无返回值
Thread(Runnable {
sleep(1000)
}).start()
// 单参数不带返回值
view.setOnClickListener { v ->
Log.e(“tag”, “{v.tag}”)  
}  
// 多参数带返回值  
view.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->  
    Log.e(“tag”, “keyCode
keyCode, ${event.keyCode}”)
if (event.keyCode == KeyEvent.KEYCODE_BACK)
return@OnKeyListener true
false
})
新面孔

1). 延迟加载
2). 流程控制
内容上一篇写过参考 Android Kotlin 学习笔记,不重复介绍

空判断

Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做空判断处理

//类型后面加?表示可为空
var age: String? = “23”
//抛出空指针异常
val ages = age!!.toInt()
//不做处理返回 null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt() ?: -1

更多空处理NullPointException 利器 Kotlin 可选型

注意事项

内部类和参数默认为public,而在Java中为 default 即在同一个包中可见
类默认为不可继承(final),想要可被继承要声明为open或abstract
取消了static关键字,静态方法和参数统一写在companion object块
internal模块内可见,inner内部类

以上仅是对使用频率较高的语法总结,学会基本可以阅读Kotlin代码,遇到点问题Google速查一下,至于智能转换、类型推导之类的不用说使用后喜欢自然就会了。当然这只是kotlin的基本语法,方便Java快速熟悉kotlin,深入学习还请阅读相关资料。

相关链接

在线学习
Kotlin 官方文档
翻译出处kotlin-web-site-cn
中文站(更新到 1.1):https://www.kotlincn.net/
网址(更新到 1.0.3):http://tanfujun.com/kotlin-web-site-cn/
Kotlin 中文论坛:https://www.kotliner.cn/

原创粉丝点击