zoukankan      html  css  js  c++  java
  • Kotlin学习-基础知识点

    一:基础要点

    //常量定义 val
    val arg_a1: Int = 1  
    //变量定义var
    var arg_a2 = 5  // 系统自动推断变量类型为Int

    备注:kotlin 定义变量必须给定初始值,如延迟初始值,需要特殊声明!

    空对象处理
    //可null对象声明

    //类型后面加?表示可为空
        var agrs_t: String? = null
    //抛出空指针异常
        val v1 = agrs_t!!.toInt()
    //不做处理返回 null   //the safe call operator, written ?.
        val v2 = agrs_t?.toLong()
    //age为空时返回-1,   非空正常执行
        val v3 = agrs_t?.toInt() ?: -1
    
    //显示判断处理
     val l: Int = if (b != null) b.length else -1
    
        val b: String? = "Kotlin"
        if (b != null && b.length > 0) {
            print("String of length ${b.length}")
        } else {
            print("Empty string")
        }
    
    //安全处理符处理 
    //the safe call operator, written ?.
    
    val lt = b?.length ?: -1//为空为-1
    
     val files = File("Test").listFiles()
     println(files?.size ?:"empty")
    

    类型判断及转化

    //类型判断,如果为String类型,则自动转为String
    if (obj is String) {
        print(obj.length)
    }
    // 非此类型判断,same as !(obj is String)
    if (obj !is String) {
        print("Not a String")
    }

    //可null类型转化
    val x: String? = y as String?
    //非null转化
    //null cannot be cast to String as this type is not nullable,
    val x2: String = y as String

    equels与引用比较:

    两个对象内容比较(Java中的equels)==两个等号代表

    两个引用比较使用===三个等号代表

    Equality checks: a == b    ,!==
    Referential equality: a === b

    this关键字引用含义

    class A { // implicit label @A
    	inner class B { // implicit label @B
    		fun Int.foo() { // implicit label @foo
    			val a = this@A // A's this
    			val b = this@B // B's this
    			val c = this // foo()'s receiver, an Int
    			val c1 = this@foo // foo()'s receiver, an Int
    			val funLit = lambda@ fun String.() {
    				val d = this // funLit's receiver
    			}
    			val funLit2 = { s: String ->
    			// foo()'s receiver, since enclosing lambda expression
    			// doesn't have any receiver
    			val d1 = this
    			}
    		}
    	}
    }
    

     说明:

    1,this默认不加标签,如在类的成员内,标识当前类对象,在成员函数或扩展函数内部则this代表的是接受者类型对象(如变量c,c1代表作用对象Int)

    2,this加上@对应类名称代表指定类对象引用,如a,b

    函数定义

    //返回值函数
    fun sum(a: Int, b: Int): Int {
        return a+b
    }

    //无返回值
    fun getHello(){
            //......
     }

    //不定参数定义函数
    fun varsFor(vararg v:Int){//变长参数 vararg
        for(vt in v){
            print(vt)
        }
    }

     //函数返回可null类型
    fun getStringLength(obj: Any): Int? {
        // `obj` 的类型会被自动转换为 `String`
        if (obj is String && obj.length > 0)
            return obj.length
        return null // 这里的obj仍然是Any类型
    }

    条件控制:

    fun blockIfWhen(a:Int ,b:Int){
        val max1 = if (a > b) a else b
    
        var max2: Int
        if (a > b) {
            max2 = a
        } else {
            max2 = b
        }
    
        val result = if(a == 1) {
                    "one"
                }else {
                    "other"
                }
    
        var x = 0
        //将参数和所有的分支条件顺序比较,直到某个分支满足条件。
        //类似其他语言的 switch 内部else(default)
        when (x) {
            0, 1 -> println("x == 0 or x == 1")
            8, 9 -> println("x == 8 or x == 9")
            else -> println("otherwise")
        }
    
        when (x) {
            1 -> println("x == 1")
            2 -> println("x == 2")
            else -> { // 注意这个块
                println("x 不是 1 ,也不是 2")
            }
        }
    
        when (x) {
            in 0..10 -> println("x 在该区间范围内")
            else -> println("x 不在该区间范围内")
        }
    
        var tx :Any ?= null
        when (tx) {
            is Int -> print(tx + 1)
            is String -> print(tx.length + 1)
            is IntArray -> print(tx.sum())
        }
    
        //when 也可以用来取代 if-else if链。 如果不提供参数,所有的分支条件都是简单的布尔表达式
        when {
            x < 5 -> print("x is odd")
            x < 9 -> print("x is even")
            else -> print("x is funny")
        }
    
    }
    

      

    集合:kotlin集合分为mutable(可变类型,元素可修改),read-only(只读类型,没有add,remove,set方法)
    1,集合类型包含三种类型:List、Set、Map
    2,三种集合类型分别对应MutableList<E>、MutableSet<E>、MutableMap<K,V>接口

     这里以数组为例:

     //数组,2种创建 arrayof() ,Array(函数表达式)
        //方式一 arrayOf(...)元素初始化
        //指定类型
        val a = intArrayOf(1, 2, 3)// or arrayOf<Int>(1,2,3)
        //不限制类型
        val a1 = arrayOf(1,"2",true,1.0f,100L)
        //方式二 Array(函数or表达式)
        val b = Array(10, { i -> (i*2) })//[0,2,4,6,8,]
        val b1 = Array(3, { initArray(it) })//[10,11,12...]
        //获取元素
    //    b[1] or b.get(2)
        //注:数组内元素为immutable类型,即只读属性
    
        //List 类型,只读类型
        val list1 = listOf(1,2,"3",true) // 不定类型创建
        val list2 = listOf<String>("1","2","3")  // 确定元素的值类型
        val list3 = listOf(a)   // 使用数组创建
        //备注:List一旦创建不可修改,add set remove不能使用
    
        //MutableList 元素可修改
        val mutaList1 = mutableListOf<String>("1","2","3")//通过函数mutableListOf创建
        val mutaList2 = MutableList(5,{ i -> i*10 })//直接创建并初始化
        val mutaList3 = mutableListOf<String>()//创建空的MutableList,后面可以添加元素
        mutaList1.add("11")
        mutaList1.removeAt(2)
        mutaList1.set(0,"mm")
    
        //Array List,MutableList 内的元素不能为null
        //可以包含null元素的容器需要特殊声明
        //空元素的数组
        var arr = arrayOfNulls<String>(5)
        arr[0]="11"
        arr[1]=null
        //包含空元素的List
        val nullableList: List<Int?> = listOf(1, 2, null, 4)
        //可含有null元素容器
        val nullableMList:MutableList<String?> = mutableListOf()
        nullableMList.add("11")
        nullableMList.add(null)

    集合常用函数

    fun listOperate(){
        val items = listOf(1, 2, 3, 4)
        items.first() //== 1
        items.last() //== 4
        val subItems = items.filter { it % 2 == 0 }   // returns [2, 4]
        var sub2 = items.slice(1..3)
        var sub3 =items.filterNot { it>100 }
    
        //高阶函数
        //遍历list
        items.forEach{
    //        it= it*2+1
            print(it)
        }
        items.forEachIndexed { index, value -> if (value > 8) println("value of index $index is $value") }
        //T->R 集合中的元素通过某个方法转换后的结果存到一个集合
        val list11 = items.map { (it - 2+1).toLong() }
        val list111 = items.mapIndexed { index, it -> if(index>5) 10 * it }
        //合并两个集合
    //    items.flatMap { listOf(it, it + 1) }
    
    //    map:遍历每一个元素
    //    flatMap:遍历每一个元素,并铺平(展开内部嵌套结构)元素
        var list_map = listOf(listOf(10,20),listOf(30,40),listOf(50,60))
        var mapList = list_map.map{ element -> element.toString() }
        var flatMapList = list_map.flatMap{ element -> element.asIterable() }
    //    map [[10, 20], [30, 40], [50, 60]]
    //   flatmap [10, 20, 30, 40, 50, 60]
    
        // filter all 符合条件element
        val list12 = items.filter { mypre(it) }
        //filter 到第一个不符合条件元素返回,后面不再过滤
        val list13 = items.takeWhile { (it%2!=0) }
        //提取前3个元素
        val list14 = items.take(3)
        //提取后3个
        val list15 = items.takeLast(3)
        //去除重复元素
        var list16 = items.distinct()
        //指定key过滤条件
        var list17 = items.distinctBy { it*101+100 }
    //    list1.fold(5,operation = )
        //匹配交集元素
        var list18 = items.intersect(listOf<Int>(2,3,4))
        //匹配两个集合内所以不同元素,差集合
        var list19 = items.union(listOf<Int>(2,3,4))
        //返回匹配条件元素
        var list21 = items.any { (it in 10..20) }
        //返回符合条件元素个数
        var list22 = items.count { it >20 }
        //给定初始值,指定计算函数对元素累计处理
        var list23 = items.fold(10) { total, next -> total + next }
        //指定计算函数对元素累计处理
        var list24 =items.reduce { total, next -> total - next }
    
        var sumFilterResult : Int = 0
        items.filter { it < 7  }.forEach { sumFilterResult += it }
    
        val rwList = mutableListOf(1, 2, 3)
        // 去除null元素
        rwList.requireNoNulls()  //returns [1, 2, 3]
        //检测list内有符合条件元素
        if (rwList.none { it > 6 }) println("No items above 6")  // prints "No items above 6"
        //第一个元素,或为空对象
        val item = rwList.firstOrNull()
    
        //集合分组
        val groupItem:Map<String,List<Int>> = items.groupBy { handleGroup(it) }
    
    
        val numbers11 = setOf(1, 2, 3)
        println(numbers11.mapNotNull { if ( it == 2) null else it * 3 })
        println(numbers11.mapIndexedNotNull { idx, value -> if (idx == 0) null else value * idx })
    
        val colors = listOf("red", "brown", "grey")
        val animals = listOf("fox", "bear", "wolf")
        //集合元素组合压缩
        val zipResult = colors.zip(animals) { color, animal -> "The ${animal.capitalize()} is $color"}
        println(zipResult)
    
    
        val numbers = listOf("one", "two", "three", "four", "five")
        println(numbers.elementAtOrNull(5))
        println(numbers.elementAtOrElse(5) { index -> "The value for index $index is undefined"})
        println(numbers.last { it.startsWith("f") })
        println(numbers.firstOrNull { it.length > 6 })
        //数据采样
        println(numbers.slice(0..4 step 2))//[one, three, five]
        println(numbers.slice(setOf(3, 5, 0)))//[four, six, one]
        //安匹配条件分组,转换value
        println(numbers.groupBy { it.first().toUpperCase() })//{O=[one], T=[two, three], F=[four, five]}
        println(numbers.groupBy(keySelector = { it.first() }, valueTransform = { it.toUpperCase() }))//{o=[ONE], t=[TWO, THREE], f=[FOUR, FIVE]}
        //分块处理
        val numbers2 = (0..13).toList()
        println(numbers2.chunked(3))//[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]]
        println(numbers2.chunked(3) { it.sum() })//per chunk sum
    }
    
    fun handleGroup(v:Int):String{
        if(v%2==0) return "even"
        else return "odd"
    }
    
    fun arrayOfMinusOnes(size:Int): IntArray {
        return IntArray(size).apply { fill(-1) }
    }
    
    fun mypre(t:Int): Boolean{
        return t%2==0
    }

    lateinit是否初始化判断

    lateinit var mLoginViewModel: LoginViewModel
    if(::mLoginViewModel.isInitialized){
                return
            }
    

            
    lazy初始化状态判断    

    val delegateHomePage = lazy{ HomeFragment() }
        private val mPageHome by delegateHomePage        
        if(delegateHomePage.isInitialized()) ts.show(mPageHome)
        else{
                ts.add(R.id.mainContent,mPageHome)
                listPage.add(mPageHome)
            }
    
  • 相关阅读:
    .net ORM架构列表
    C#向win32程序窗口中的文本框设置指定文本
    C#串口通信总结
    MPF配置文件参数管理
    WF牛人们的资源
    BDD初步
    DevExpress 汉化(简单、实用、快速)
    WPF中的命令简述(Command)
    Devexpress汉化资源
    Silverlight架构列表
  • 原文地址:https://www.cnblogs.com/happyxiaoyu02/p/9953689.html
Copyright © 2011-2022 走看看