• Kotlin 优点


    抄记于Kotlin 中文网

    Kotlin Playground: Edit, Run, Share Kotlin Code Online

    1. // 一行代码实现实体类定义

    /*
     使用一行代码创建一个包含 getters、 setters、 `equals()`、 `hashCode()`、 `toString()` 以及 `copy()` 的 POJO:
    */

    data class Customer(val name: String, val email: String, val company: String)

    2. // 或者使用 lambda 表达式来过滤列表:filter

    val positiveNumbers = list.filter { it > 0 }

    3. // 想要单例?创建一个 object 就可以了:object 快速定义单例

    object ThisIsASingleton {
        val companyName: String = "JetBrains"
    }

    4. // 自动检测空属性定义

    var output: String
    output = null   // 编译错误

    // Kotlin 可以保护你避免对可空类型进行误操作强制使用安全操作符 ? 进行操作

    val name: String? = null    // 可空类型
    println(name.length())      // 编译错误

    println(name?.length())   // 编译通过

    lateinit 修饰的变量必须在合适的时机进行初始化 否则编译时报错

    by lazy{ }  被调用时才进行初始化

    5. // is 关键词    并且如果类型检测正确,编译器会为你做自动类型转换
    fun calculateTotal(obj: Any) {
        if (obj is Invoice)
            obj.calculateTotal()
    }

    6.兼容JVM上边所有的库

    7.vararg  参数数量可变

    class MutableStack(vararg items: E) { 

    }

    使用 

    MutableStack(1,2,3,4,5)

    MutableStack(1, 2)

    8.泛型E   定义可变类 MutableStack

    可变参数vararg datas:E

    class MutableStack(vararg items: E) { 

    }

    使用

    MutableStack(1,2,3,4,5)

    MutableStack("1","2")

    9. 类继承或方法重写问题

    Kotlin 创建的类/方法默认是不可以被继承/重写的

    如果需要对类进行继承/重写  需要在类/方法加上open 进行修饰

    覆盖方法则必须要使用override 进行修饰

    open class Dog {                // 1
        open fun sayHello() {       // 2
            println("wow wow!")
        }
    }

    class Yorkshire : Dog() {       // 3
        override fun sayHello() {   // 4
            println("wif wif!")
        }
    }
    10.when  不仅可以做条件判断还可以返回值函数使用

    fun whenAssign(obj: Any): Any {
        val result = when (obj) {                   // 1
            1 -> "one"                              // 2
            "Hello" -> 1                            // 3
            is Long -> false                        // 4
            else -> 42                              // 5
        }
        return result
    }
    11.for 循环的 in 关键词很有用,不仅在 for 上边可以进行循环区间限制,还可以进行 if 条件的区间判断

    val x = 2
    if (x in 1..5) {            // 1
            print("$x is in range from 1 to 5")
    }

    12. "="  "=="  "==="号的区别

    "=" 是赋值

    "==" 是比较数值是否一致

    "===" 是比较引用对象是否一致

    13.常见的类修饰词

    object   

    sealed  密封类   只能在同一个包内进行类继承

    open     可继承类   (默认是final 不可继承也称为内联类)

    data      数据封装类  直接帮实现了 hashCode/copy/equest/componentN 方法

    enum    枚举类

    companion object  伴生类 甚至可以省略掉伴生对象的类名相当于java的Static

    14.高阶函数

    其实就是一个表达式,将符合表达式的函数方法代入到表达式从而进行相关业务处理

    使用高阶函数时需要使用  ::  符合 

    注意这里离的sum方法的参数必须对齐calculate方法的第三个参数定义的高阶函数参数

    fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {  // 1
        return operation(x, y)                                          // 2
    }

    fun sum(x: Int, y: Int) = x + y                                     // 3

    fun main() {
        val sumResult = calculate(4, 5, ::sum)                          // 4
        val mulResult = calculate(4, 5) { a, b -> a * b }               // 5
        println("sumResult $sumResult, mulResult $mulResult")
    }

    15.list 的一些相关操作

    list.map{ } 对所有元素进行相关业务操作  返回修改后的对象

    filter{ }  对元素进行条件过滤   返回符合fitlre条件 的list

    any{ }  任意一个元素符合业务则返回 true

    all { }  全部元素符合业务则返回true

    non { } 全部元素与元素不匹配则返回true

    find { } 查找第一个匹配业务的元素

    findLast {}  查找最后一个匹配业务的元素

    first()  第一个元素

    last() 最后一个元素  

    first{  }  符合业务的第一个元素  如果不存在符合业务元素会报NoSuchElementException

    last{  }  符合业务的最后一个元素 如果不存在符合业务元素会报NoSuchElementException

    firstOrNull{ } 符合业务的第一个元素  如果不存在符合业务元素返回Null

    lastOrNull{ } 符合业务的最后一个元素 如果不存在符合业务元素返回Null

    minOrNull  返回集合内最小的元素值/如果集合是空集合那么返回Null

    maxOrNull 返回集合内最大的元素值/如果集合是空集合那么返回Null

    count() 计数 

    count{ } 统计符合业务的数量

    partition{ }  以符合业务条件进行分组

                    使用方法

                    val evenOdd = numbers.partition { it % 2 == 0 } 

    或者        val (positives, negatives) = numbers.partition { it > 0 }   

    list组合后使用map 或者 flatMap  进行数组合并map是两个集合  flatMap是全部合并到一个集合

    sorted()  排序从小到大

    sortedBy{ } 按规定进行排序

    sortedDesending() 进行倒置排序

    zip 进行集合间合并默认形式 {(A,B),(A1,B1)}

    zip 自定义     A.zip(B){   }  自行定义业务

    由于get(index)  或者 list[index]   当index 在list 中不存在(即超出size - 1或者小于0时)是会报异常的

    getOrElse(index){  }  当索引index在list不存在时返回一个指定值避免异常抛出导致程序崩溃

    16.map

    获取值 map[key]   key指设置时的key  如果不存在对应的key 则返回Null

    getValue(key)  获取key对应的值,但是当key不存在时会抛出异常

    var defaultMap = map.withDefault{ it } 自定义不存在key时的返回值

    defautlMap.getValue(key)

    17.对象相关操作范围函数

    let{it } 用于范围和空检查  可调用{ } 里边的自定义属性对该对象进行操作

    run{ } 用法跟let 一致但不需要定义或者调用默认的对象名称进行方法调用,{ }内可直接调用方法

    with(对象实例){ }  直接调用实例对象的属性进行操作不需要根据实体对象来进行属性调用无返回值

    apply(对象实例) { } 方便对对象属性进行初始化并放回对象本身,一般用于对象初始化或者某个对象值进行修改

    also{ it }  

    18.委托模式 (对象代理)

    被调用类实现接口类方法   通过 by 关键词指向委托类  

    委托类实现同一接口类方法 

    interface SoundBehavior {                                                          // 1
        fun makeSound()
    }

    class ScreamBehavior(val n:String): SoundBehavior {                                // 2
        override fun makeSound() = println("${n.toUpperCase()} !!!")
    }

    // Tom Araya is the "singer" of Slayer
    class TomAraya(n:String): SoundBehavior by ScreamBehavior(n) 

    fun main() {
        val tomAraya = TomAraya("Thrash Metal")
        tomAraya.makeSound()                       

    }

    19.operator  属性代理 

    将需要代理的属性传递给代理属性对象

    创建普通类  创建属性 通过by 关键词将其代理代理类

    创建代理类           代理类再创建通过operator 修饰的方法

    最终在普通类属性在被get或者set时代理类都会感知到该属性的变化

    一般来说一个属性对应一个代理类,防止混淆

    class Example {
        var p: String by Delegate()                                               // 1
        var loginAccount :String by Delegate()
      
        override fun toString() = "Example Class"
    }

    class Delegate() {
        operator fun getValue(thisRef: Any?, prop: KProperty<*>): String {        // 2

            // 业务处理 最终返回该属性值    
            return "$thisRef, thank you for delegating '${prop.name}' to me!"
        }

        operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) { // 2

            // 对该属性进行设置 或者
            println("$value has been assigned to ${prop.name} in $thisRef")
        }
    }

    fun main() {
        val e = Example()
        println(e.loginAccount)

    }

    20.lazy 标准属性代理 上边19具体到代理属性的类,这里不需要代理属性的类 且lazy的属性必须用val进行修饰,否则编译报错

    val tokent:String by lazy{  }

    val tokent:String by blockingLazy{  }    线程安全保障所有的线程获取到的值都是相同的

    好了Kotlin 的基本有优点就介绍到这里了,还有一个有点就是协程,协程相对比较复杂和庞大需要另行起稿文章进行解释.  看到这里如果有帮助到你,不要忘记点赞 + 关注哦     o - v - o .

  • 相关阅读:
    VB、C#、VC使用条件编译自动选择结构体对齐方式
    webpack5 (四)
    【Linux】ping命令详解
    RabbitMQ系列【15】AmqpAdmin使用详解
    k8s限制pod的资源使用
    重载运算符C++---学习笔记
    Java设计模式之建造者模式详解(Builder Pattern)
    面试官:你知道websocket的心跳机制吗?
    leetcode刷题 (6.1) 字符串
    4个有影响力的绩效管理最佳实践
  • 原文地址:https://blog.csdn.net/qq_32216895/article/details/125972051