Android Studio上Kotlin的入门

为什么选择Kotlin

在 2019 年 Google I/O 大会上,他们宣布今后将优先采用 Kotlin 进行 Android 开发。如今,超过 60 款 Google 应用是用 Kotlin 构建的,其中包括 Google 地图、Google Home、Google Play 和 Google 云端硬盘等应用。根据 Google 的说法,Google Play 商店前 1000 个应用中有 60% 以上也使用 Kotlin。Kotlin是谷歌在安卓应用上大力支持且推荐的语言,在构建新的 Android 开发工具和内容(例如 Jetpack 库、示例、文档和培训内容)时,谷歌会在设计层面上先考虑 Kotlin 用户。

Kotlin是什么

Kotlin是由JetBrains公司开发设计的一门解释性语言,在2011年,JetBrains公布了Kotlin的第一个版本,并在2012年将其开源。2016年,Kotlin发布了1.0正式版,JetBrains在自家的旗舰开发工具IntelliJ IDEA中加入了对Kotlin的全面支持,Kotlin在这时期,已经足够成熟和稳定了。2017年,Android Studio也加入了对Kotlin的支持。

Kotlin的优势

  1. 代码更少、可读性更强 可以让我们写更少的代码,以及花费更少的时间来理解别人的代码;
  2. 更安全的代码 Kotlin 有许多语言功能,可帮助我们避免 null 指针异常等常见编程错误;
  3. 与 Java 的互操作性 可以在 Kotlin 代码中调用 Java 代码,或者在 Java 代码中调用 Kotlin 代码。对于原有的java项目,在应用程序中可以将 Kotlin 与 Java 编程语言一起使用, 而无需将所有代码迁移到 Kotlin;
  4. Android Jetpack 与其他库中的 Kotlin 支持 KTX 扩展 为现有的 Android 库添加了 Kotlin 语言特性,如协程、扩展函数、lambdas 与命名参数;
    5.易学易用 Kotlin 非常易于学习,尤其是对于 Java 开发人员而言。

第一个Kotlin应用

知道了Kotlin是什么,那我们就先用Android Studio来创建你的第一个Kotlin应用吧

创建Kotlin应用很简单,所有的步骤都和创建Java应用是一样的,只需在创建时,将所使用的语言改为Kotlin就行
创建Kotlin项目
创好了后,我们打开MainActivity,可以看到,比起java,Kotlin的代码要少一些,写类和方法的语法规则也不同。

class MainActivity : AppCompatActivity() {
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

Kotlin的基本语法规则

Kotlin每一行代码的结尾是不用加分号的

变量

在Kotlin中定义变量的方式和java区别很大,Kotlin定义变量时,只允许在变量前声明两种关键词:val 和 var

val(value的缩写),它用来声明一个不可变的变量。这种变量在初始初始赋值之后,就不能再被复制了,相当于java中用 final声明。
var(variable的缩写),它用来声明一个可变的变量。这种变量在初始赋值之后依旧可以重新赋值。

常量与变量都可以没有初始化值,但是在引用前必须初始化

编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。

val x: Int = 10 //完整的声明变量
val y = 10 // 不指定变量类型,系统自动推断变量类型为Int
val z: Int // 如果不在声明时初始化值,则必须提供变量类型
z = 10 //对不可变的变量明确赋值,赋值后不能再次赋值

var a = 1 // 系统自动推断变量类型为Int
a += 1 // 变量可修改

读者可以看到,Kotlin中Int的首字母是大写的,而Java中int的首字母是小写的。这是因为Kotlin没有使用Java的基本数据类型,而是使用了对象数据类型。在java中,int是关键字,而在Kotlin中,Int是一个,它有自己的方法和数据结构。所以,我们可以给Int等对象数据类型添加扩展函数,文章后文的Toast简化就是基于此点的。

函数

Kotlin中定义函数的关键字是fun(function的缩写),无论你想定义什么函数,都必须用fun进行声明
紧跟在fun后面的是函数名,函数名后括号里面放的是接收的参数。参数的格式名是“参数名:参数类型
若是有返回值的话,就将返回值类型以冒号隔开,写在函数名括号的后面;若是没有返回值,可以省略不写,或者写关键字为 Unit,类似与java的void

实例:接收两个不同类型参数,且返回值为String的函数

fun functionDemo(parm1 : Int, parm2 :  String) : String{
    
    
     return parm2
}

实例:当一个函数中只有一行代码时,Kotlin允许我们不必编写函数体,可以直接将唯一的一行代码用等号连接,直接写在函数定义的后面

//改写前
fun sum(parm1: Int, parm2: Int): Int {
    
    
    return a + b
}

//改写后
fun sum(parm1: Int, parm2: Int) = a + b    //返回值类似也省略了,由编译器自动推断类型

匿名函数

Kotlin支持lambda表达式。并非每个函数都需要一个名称。某些函数通过输入和输出更直接地进行标识。这些函数称为“匿名函数”。

lambda表达式的写法为:(type1,type*) -> type_return = { }
使用实例:

fun main(args: Array<String>) {
    
    
    val sumLambda: (Int, Int) -> Int = {
    
    x,y -> x+y}  //(Int, Int) -> Int = {x,y -> x+y}就是一个匿名函数
    println(sumLambda(1,2))  // 输出 3
}

字符串模板

字符串可以包含模板表达式,即可求值的代码片段,并将它的结果连接到字符串里面。

字符串模板表达式可以是 $变量名 ${变量名}
实例:

val a = 10
val s1 = "a = $a" // 结果为 "a = 10"

val s = "abc"
val str = "$s.length is ${s.length}" // 结果为 "abc.length is 3"

a = 2
// 模板中的任意表达式:
val s2 = "${s1.replace("is", "was")}, but now is $a" 
//结果为“a was 10 , but now is 2 ”

var name = "张三"
var sex = true
var date = "2021年1月2日"
var time = "11点59分"
var work ="该睡觉了"
val orderInfo = "你好,${name} ${if(sex)"cool boy" else "cool girl" },"+"现在已经是${date}\t${time}了,"+"你${cacke}"
//结果为"你好,张三 cool boy,现在已经是2021年1月2日 11点59分了,你该睡觉了"

注释

Kotlin 支持单行(或行末)与多行(块)注释。

// 这是一个行注释
/* 这是一个多行的
块注释。 */

Kotlin 中的块注释可以嵌套

/* 注释从这里开始
/* 这是嵌套的注释 */
并且在这里结束。 */

Null 安全

在某些语言中,可以声明引用类型变量而不明确提供初始值。在这类情况下,变量通常包含 null 值。默认情况下,Kotlin 变量不能持有 null 值。这意味着以下代码段无效:

// 赋值失败
val languageName: String = null

要使变量持有 null 值,它必须是可为 null 类型。可以在变量类型后面加上 ? 后缀,将变量指定为可为 null,如以下示例所示:

val languageName: String? = null

当使用可以可返回Null的函数时,要注意Null安全,应该先做判断处理

fun printProduct(arg1: String, arg2: String) {
    
    
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    // 直接使用 "x * y" 会导致编译错误,因为它们可能为 null
    if (x != null && y != null) {
    
    
        // 在Null检测之后,x 与 y 会自动转换为非空值(non-nullable)
        println(x * y)
    }
    else {
    
    
        println("'$arg1' or '$arg2' is not a number")
    }    
}

类型检测和自动类型转换

我们可以使用 is运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。 如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换
示例:

//写法一
fun getStringLength(parm: Any): Int? {
    
    
  if (parm is String) {
    
    
    // 做过类型判断以后,"parm"会被系统自动转换为String类型
    return parm.length 
  }

  // 这里的parm仍然是Any类型的引用
  return 0
}

//写法二
fun getStringLength(parm: Any): Int? {
    
    
    if (parm !is String) return 0

    // "parm" 在这一分支自动转换为 "String"
    return parm.length
}

//写法三
fun getStringLength(parm: Any): Int? {
    
    
  //用到了&&运算符的短路特性 
  // 在 "&&" 运算符的右侧, "parm" 的类型将会被自动转换为 "String"
  if (parm is String && obj.length > 0)
    return parm.length
  return 0
}

简化Toast的用法

Toast的标准用法为:

Toast.makeText(content, “this is content by showed”, Toast.LENGTH_SHORT).show()

如果你需要多次调用Toast方法,就会感觉这是一段很长,且内容都是重复的代码,且容易忘记调用最后的show()方法,不仅Toast没法弹出来,还容易产生一些奇怪的bug。
一般而已,我们调用Toast时,想要显示的都是String或者Int类型的数据,我们只需要在Kotlin中的String和Int类中各添加一个扩展函数,然后在里面封装弹出toast的具体逻辑就好了。这样,想要弹出Toast提示的时候,只要调用它们的扩展函数就可以了。
我们只需要新建一个kt文件,然后写如下代码就可以了:

fun String.showToast(context:Context,  showTime: Int = Toast.LENGTH_SHORT){
    
    
     Toast.makeText(context, this,  showTime).show()
}

fun Int.showToast(context:Context,  showTime: Int = Toast.LENGTH_SHORT){
    
    
     Toast.makeText(context, this,  showTime).show()
}

有了这个扩展代码后,我们再需要使用Toast时,只需要这么写就可以了:

“This is want to show”.showToast(context)

在上述函数中, showTime是有默认值的参数,我们也可以重新设置Toast的显示时间:

“This is want to show more long”.showToast(context, Toast.LENGTH_LONG)

作者 游鹏
原文地址

猜你喜欢

转载自blog.csdn.net/fjnu_se/article/details/112154428