Kotlin 基础精华篇

Kotlin 基础精华篇
Kotlin 内联函数let、with、run、apply、also
Kotlin 协程学习总结


一、类的几种类型

外部类类类型 能否被继承或实现 能否有构造方法
class 否 是
open class 是 是
abstract class 是 是
object 否 是
enum class 否 是
interface 是 否
内部类类型 是否可定义多个 是否单例 是否静态内部类
class 是 否 是
inner class 是 否 否
object 是 是 是
companion object 否 是 是


二、一些常用函数

1、通过求和来看看函数的几种方式
    private fun sum(a: Int, b: Int): Int {
        return a + b
    }

    private val sum1: (Int, Int) -> Int = { a, b -> a + b }

    private fun sum2(a: Int, b: Int) = a + b
    // vararg 可变参数 ;sum() 为kotlin提供的函数,其实就是for循环求和
    private fun sum3(vararg numbers: Int) = numbers.sum()
    // sumBy 支持对原始数据进行加工
    private fun sum4(vararg numbers: Int) = numbers.sumBy { it * 2 }

运行结果:

        println("sum result is ${sum1(1, 5)}")
        println("sum result is ${sum1}")
        println("sum result is ${sum2(1, 5)}")
        println("sum result is ${sum3(1, 2, 3, 4, 5)}")
        println("sum result is ${sum3()}")
        println("sum result is ${sum4(1, 2, 3, 4, 5)}")

        //输出:
        sum result is 6
        sum result is Function2<java.lang.Integer, java.lang.Integer, java.lang.Integer>
        sum result is 6
        sum result is 15
        sum result is 0
        sum result is 30
2. 三目运算符使用 if-else 或 ?:
    java  --->    return object == null ? "" : object.toString();

    kotlin--->    return if(any == null) "" else any.toString()

    kotlin--->    return any?.toString() ?: ""
3.字符串比较使用 == > < ,不必 equals了
        var currentVersion = "v1.0.1"
        var lastVersion = "v1.0.1.1"

        if (lastVersion == currentVersion) {
            println("维持原版本")
        } else if (lastVersion > currentVersion) {
            println("升级到最新版本")
        } else {
            println("数据错误")
        }
        
        //输出:升级到最新版本
4.类型判断 is !is (相当于java的 instanceof),类型明确则可自动进行类型转换
    private fun anyLength(any: Any?): Int {
        return when (any) {
            is String -> {
                //any 自动类型转换为 String,不必 (any as String).length
                any.length
            }
            is List<*> -> {
                //any 自动类型转换为 List
                any.size
            }
            is UserInfo -> {
                //any 自动类型转换为 UserInfo
                any.id.toInt()
            }
            !is Set<*> -> {
                -1
            }
            else -> 0
        }
    }
5.区间判断 in !in

for-in-.. 是闭区间,如for(i in 0..10) 中i取值范围是[0,10] (即0 <= i <= 10)
for-in-until是左闭右开,如for(i in 0 until 10) 中i取值范围是[0,10) (即0 <= i < 10)
所以遍历List切勿 for(i in 0..list.size)哦

downTo 倒序遍历
step 设置遍历步长

        val list = ArrayList<String>()
        val start = 'a'.toInt()
        for (i in start..start + 10) {
            //添加11个元素到列表
            list.add(i.toChar().toString())
        }
        
        //List全量遍历
        for (str in list) {
            print("$str, ")  //输出:a, b, c, d, e, f, g, h, i, j, k,
        }
        //List全量遍历
        list.forEach {
            print("$it, ")  //输出:a, b, c, d, e, f, g, h, i, j, k,
        }

        println()
        println("a" !in list)  //输出:false
        println("d" in list)  //输出:true
        println("z" in list)  //输出:false

        //遍历步长
        for (i in 0 until list.size step 2) {
            print("${list[i]}, ")  //输出: a, c, e, g, i, k, 
        }
        println()
        //倒序遍历
        for (i in list.size - 1 downTo 0 step 3) {
            print("${list[i]}, ")  //输出: k, h, e, b, 
        }
6.常用集合操作

subList 截取
filter 过滤
sortedBy 根据某元素正序
sortedByDescending 根据某元素倒序
map 转换
forEach 遍历

        list.subList(2, 8) //输出:c, d, e, f, g, h,
            .filter { it[0].toInt() < 'a'.toInt() + 5 }  //输出:c, d, e,
            .sortedBy { it[0].toInt() }  //输出:c, d, e,
            .sortedByDescending { it }   //输出:e, d, c,
            .map { it.toUpperCase(Locale.ROOT) }  //输出:E, D, C, 
            .forEach { print("$it, ") }
7.自定义函数支持lambda
    // 通常写法,不支持lambda
    fun setOnViewClickListener(listener: OnViewClickListener) {
        this.onViewClickListener = listener
    }

    // 支持lambda
    fun setOnViewClickListener(action: (View, Int) -> Unit) {
        this.onViewClickListener = object : OnViewClickListener {
            override fun onViewClick(view: View, type: Int) {
                action(view, type)
            }
        }
    }

    // 自定义回调
    interface OnViewClickListener {
        fun onViewClick(view: View, type: Int)
    }

调用:

        setOnViewClickListener(object : OnViewClickListener {
            override fun onViewClick(view: View, type: Int) {
                //TODO
            }
        })
        
        //简写
        setOnViewClickListener { view, i ->
            //TODO
        }




未完待续

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容