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)
            }
    
  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/happyxiaoyu02/p/9953689.html
Copyright © 2011-2022 走看看