• kotlin之基础1


    一. Kotlin的基本语法入门:
    基本观念(对比于Java)
    数据类型

    变量 & 常量
    函数
    其他语法糖(控制流、类型检查 & 转换、安全性等)

    2. 定义
    Android开发的一级编程语言(Google官方认证)
    由JetBrains公司在2010年推出 & 开源,与Java语言互通 & 具备多种Java尚不支持的新特性
    Android Studio3.0后的版本支持Kotlin。
    特点:
    简洁:相对于Java,大大减少代码数量
    安全:
    在编译时期就处理了可能会产生空指针的情况,若产生空指针,会编译不通过,从而避免了执行代码时出现空指针异常。
    互操作性:
    与Java语言互通(能相互调用),可使用所有用Java写的代码和库; 在同一个项目中可同时使用Kotlin和Java混合编程;
    工具友好:
    可使用任何ava IDE或命令行构建;
    如同样是JetBrains公司出品的Android Studio

    二. Kotlin那些实用的语法糖:空安全、类型转换 & 相等性判断.
    Kotlin的一些实用语法糖,主要包括:
    范围使用:in、downTo、step、until
    类型检查 & 转换:is、智能转换、as
    相等性:equals()、==、===
    空安全

    1. 范围使用:主要用于表示范围,主要包括:in、downTo、step、until
    1. in 作用:在...范围内。
    表示:若i在1-5范围内。 注:闭区间,[1,5]
    if (i in 1..5) {
    println("i 在 1-5 内")
    }
    表示:若i不在1-5范围内, !in表示不在...范围内。
    if (i !in 1..5) {
    println("i 不在 1-5 内")
    }

    2. until 作用:表示开区间
    for (i in 1 until 5) {
    println(i) // 输出1234
    }

    3. downTo 作用:倒序判断
    for (i in 5 downTo 1) {
    println(i)
    }

    4. step 作用:调整步长
    // 设置步长为2,顺序输出1、3、5
    for (i in 1..5 step 2) println(i)
    // 设置步长为2,倒序输出5、3、1
    for (i in 1 downTo 5 step 2) println(i)

    2. 类型检查 & 转换
    包括:is、智能转换 和 as
    1). is 作用:判断一个对象与指定的类型是否一致
    var a: Any = "a"
    if (a is String) {
    println("a是String类型")
    }
    if (a !is Int) {
    println("a不是Int类型")
    }

    2). 智能转换:
    说明: kotlin不必使用显式类型转换操作,因为编译器会跟踪不可变值的is检查以及显式转换,并在需要时自动插入(安全的)转换
    var a: Any = "a"
    if (a is String) {
    println("a是String类型")
    println(a.length) // a 自动转换为String类型
    //输出结果为:1
    }

    // 反向检查: a自动转换为String类型
    if (a !is String) {
    print(a.length)
    }

    在 && 和 || 的右侧也可以智能转换:
    `&&` 右侧的 a 自动转换为String
    if (a is String && a.length > 0)
    // `||` 右侧的 a 自动转换为String
    if (a is String || a.length > 0)

    在when表达式和while循环里也能智能转换:
    when(a){
    is String -> a.length
    is Int -> a + 1
    }

    // 需要注意:当编译器不能保证变量在检查和使用之间不可改变时,智能转换不能用。智能转换能否适用根据以下规则:
    // 1. val 局部变量——总是可以,局部委托属性除外;
    // 2. val 属性——如果属性是 private 或 internal,或者该检查在声明属性的同一模块中执行。智能转换不适用于 open 的属性或者具有自定义 getter 的属性;
    // 3. var 局部变量——如果变量在检查和使用之间没有修改、没有在会修改它的 lambda 中捕获、并且不是局部委托属性;
    // 4. var 属性——决不可能(因为该变量可以随时被其他代码修改)

    3). 强制类型转换:as
    var any: Any = "abc"
    var str: String = any as String

    // 强制类型转换是不安全的,若类型不兼容则会抛出一个异常
    var int: Int = 123
    var str: String = int as String
    // 抛出ClassCastException

    4). 可空转换操作符:as?
    作用:null不能转换为String,因该类型不是可空的,此时使用可空转换操作符as?
    var str = null
    var str2 = str as String
    // 抛出TypeCastException

    // 使用安全转换操作符as?可以在转换失败时返回null,避免了抛出异常。
    var str = null
    var str2 = str as? String
    println(str2) //输出结果为:null

    3. 相等性判断
    在Kotlin中,存在结构相等 & 引用相等 两种相等判断。
    1). 结构相等:equals()或 ==
    作用:判断两个结构是否相等
    var a = "1"
    var b = "1"
    if (a.equals(b)) {
    println("a 和 b 结构相等")
    // 输出结果为:a 和 b 结构相等
    }

    var a = 1
    var b = 1
    if (a == b) {
    println("a 和 b 结构相等")
    }

    2). 引用相等:=== 作用:判断两个引用是否指向同一对象
    data class User(var name: String, var age: Int)
    var a = User("Czh", 22)
    var b = User("Czh", 22)
    var c = b
    var d = a
    // 对比两个对象的结构
    if (c == d) {
    println("a 和 b 结构相等")
    } else {
    println("a 和 b 结构不相等")
    }
    // 对比两个对象的的引用
    if (c === d) {
    println("a 和 b 引用相等")
    } else {
    println("a 和 b 引用不相等")
    }
    // 输出结果:
    a 和 b 结构相等
    a 和 b 引用不相等

    4. 空安全
    在Java中,NullPointerException异常十分常见,而Kotlin优点则是可以尽可能避免执行代码时出现空指针异常.
    1). 可空类型与非空类型: 在Kotlin中,有两种情况最可能导致出现NullPointerException
    情况1:显式调用 throw NullPointerException()
    情况2:使用!! 操作符。 说明:!!操作符将任何值转换为非空类型,若该值为空则抛出异常.
    var a = null
    a!! // 抛出KotlinNullPointerException

    情况3:数据类型不能为null
    在 Kotlin 中,类型系统区分一个引用可以容纳 null (可空引用) 和 不能容纳(非空引用)
    如:String类型变量不能容纳null。
    若要允许为空,可声明一个变量为可空字符串:在字符串类型后面加一个问号?
    对于String,则是写作:String?
    var b: String? = "b"
    b = null
    2). 安全调用操作符。 作用:表示如果若不为null才继续调用
    b?.length
    表示:若b不为null,才调用b.length。
    注:安全调用符还可以链式调用。 a?.b?.c?.d
    // 假设a不为null,才继续往下调用,以此类推
    若该链式调用中任何一个属性为null,整个表达式都会返回null;若只对非空值执行某个操作,可与let一起使用,a?.b?.let { println(it) }

    三. Kotlin:巧用内置函数let、also、with、run、apply大大提高开发效率!
    前言
    在Kotlin中,有一些用于扩展 & 方便开发者编码的内置函数,提高开发效率。
    let函数,also函数,with函数,run函数,apply函数
    基础知识:接口回调中Lambda使用
    在Kotlin中可使用Lambda函数简化一些不必要的嵌套接口回调方法
    注:仅支持单个抽象方法回调,多个回调方法不支持。

    // Java接口回调
    mVar.setEventListener(new ExamEventListener(){
    public void onSuccess(Data data){
    // ...
    }
    });
    // 同等效果的Kotlin接口回调(无使用lambda表达式)
    mVar.setEventListener(object: ExamEventListener{
    public void onSuccess(Data data){
    }
    });

    // Kotlin接口回调(使用lambda表达式,仅留下参数)
    mVar.setEventListener({
    data: Data ->
    // ...
    })
    // 继续简化
    // 简化1:借助kotlin的智能类型推导,忽略数据类型
    mVar.setEventListener({
    data ->
    // ...
    })

    // 简化2:若参数无使用,可忽略
    mVar.setEventListener({
    // ...
    })

    // 简化3:若setEventListener函数最后一个参数是一个函数,可把括号的实现提到圆括号外
    mVar.setEventListener(){
    // ...
    }

    // 简化3:若setEventListener函数只有一个参数 & 无使用到,可省略圆括号
    mVar.setEventListener{
    // ...
    }

    下面,Kotlin里提供用于扩展 & 方便开发者编码的几个有用内置函数:let函数、also函数、with函数、 run函数、apply函数。
    1. let函数
    1.1 简介
    1.2 使用方法
    // 作用1:使用it替代object对象去访问其公有的属性 & 方法
    object.let{
    it.todo()
    }
    // 作用2:判断object为null的操作
    object?.let{//表示object不为null的条件下,才会去执行let函数体
    it.todo()
    }
    // 注:返回值 = 最后一行 / return的表达式
    1.3 使用示例
    // 使用Java
    if( mVar != null ){
    mVar.function1();
    mVar.function2();
    mVar.function3();
    }
    // 使用kotlin(无使用let函数)
    mVar?.function1()
    mVar?.function2()
    mVar?.function3()

    // 使用kotlin(使用let函数)
    // 方便了统一判空的处理 & 确定了mVar变量的作用域
    mVar?.let {
    it.function1()
    it.function2()
    it.function3()
    }

    2. also函数
    2.1 作用 & 应用场景
    类似let函数,但区别在于返回值:
    let函数:返回值 = 最后一行 / return的表达式
    also函数:返回值 = 传入的对象的本身
    2.2 使用示例
    // let函数
    var result = mVar.let {
    it.function1()
    it.function2()
    it.function3()
    999
    }
    // 最终结果 = 返回999给变量result

    // also函数
    var result = mVar.also {
    it.function1()
    it.function2()
    it.function3()
    999
    }
    // 最终结果 = 返回一个mVar对象给变量result

    3. with函数
    3.1 作用
    调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可
    3.2 应用场景
    需要调用同一个对象的多个方法 / 属性
    3.3 使用方法
    with(object){
    // ...
    }
    // 返回值 = 函数块的最后一行 / return表达式

    3.4 使用示例
    // 此处要调用people的name 和 age属性
    // kotlin
    val people = People("carson", 25)
    with(people) {
    println("my name is $name, I am $age years old")
    }

    // Java
    User peole = new People("carson", 25);
    String var1 = "my name is " + peole.name + ", I am " + peole.age + " years old";
    System.out.println(var1);

    4. run函数
    4.1 作用 & 应用场景
    结合了let、with两个函数的作用,即:
    调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可
    定义一个变量在特定作用域内
    统一做判空处理
    4.2 使用方法
    object.run{
    // ...
    }
    // 返回值 = 函数块的最后一行 / return表达式
    4.3 使用示例
    // 此处要调用people的name 和 age属性,且要判空
    // kotlin
    val people = People("carson", 25)
    people?.run{
    println("my name is $name, I am $age years old")
    }

    // Java
    User peole = new People("carson", 25);
    String var1 = "my name is " + peole.name + ", I am " + peole.age + " years old";
    System.out.println(var1);
    5. apply函数
    5.1 作用 & 应用场景
    与run函数类似,但区别在于返回值:
    run函数返回最后一行的值 / 表达式
    apply函数返回传入的对象的本身
    5.2 应用场景
    对象实例初始化时需要对对象中的属性进行赋值 & 返回该对象
    5.3 使用示例
    // run函数
    val people = People("carson", 25)
    val result = people?.run{
    println("my name is $name, I am $age years old")
    999
    }
    // 最终结果 = 返回999给变量result
    // apply函数
    val people = People("carson", 25)
    val result = people?.apply{
    println("my name is $name, I am $age years old")
    999
    }
    // 最终结果 = 返回一个people对象给变量result
    至此,关于Kotlin里提供用于扩展 & 方便开发者编码的几个有用内置函数讲解完毕。

  • 相关阅读:
    rest_framework规范
    跨域问题
    网站部署(二)
    服务器更改密码后,git不能连接问题
    网站部署(一)
    Ajax
    AJAX基本使用
    Java之JNDI详解
    IntelliJ IDEA(2018.3.3) 的介绍、安装、破解、配置与使用
    数据库修改密码风险高,如何保证业务持续,这几种密码双活方案可以参考
  • 原文地址:https://www.cnblogs.com/awkflf11/p/16063833.html
Copyright © 2020-2023  润新知