美文网首页
Kotlin学习(三) : 函数

Kotlin学习(三) : 函数

作者: 8ba406212441 | 来源:发表于2018-08-27 16:33 被阅读24次

    学习笔记

    1,主构函数和次构函数constructor ,调用了次构函数,也会先调主构函数.再执行次构函数
    constructor :super
    2,继承 父类需要加上open关键字 , 子类继承父类用:表示继承或实现
    open class Father {} //需要加上open才能被继承,方法也是一样

    class son1 :Father(){
    //子类里面字段和方法需要加上override关键字
    override var name: String = "大头儿子"
    }
    3, kotlin的接口是可以实现的
    interface Drivel{
    fun driveCar(){
    println("")
    }
    }
    4, kotlin 的is 相对于java中的instanceof ,判断是否是这个类型
    if(animal is dog){
    val animal1 = animal as dog //将animal强转成dog类型,在kotlin只要判断了就不需要强转了,它会只能转换.
    }

    5,lazy()是接受一个 lambda 并返回一个 Lazy <T> 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lambda 表达式并记录结果, 后续调用 get() 只是返回记录的结果。

    lazy{} 只能用在val类型, lateinit 只能用在var类型 如 :

    val name: String by lazy { "sherlbon" }
    lateinit var adapter: MyAdapter
    

    .lateinit不能用在可空的属性上和java的基本类型上 如:

    lateinit var age: Int  //会报错
    

    lateinit可以在任何位置初始化并且可以初始化多次。而lazy在第一次被调用时就被初始化,想要被改变只能重新定义

    6,SetOnclickListener函数 转换
    例如,setOnClickListener函数,在Java中时这样定义的:

    public void setOnClickListener(OnClickListener l) {
        ...
     }
    

    而在Kotlin中我们使用它时,可以这样:

    fun setOnClickListener(l: (View) -> Unit)
    

    创建OnClickListener的匿名类:

     view.setOnClickListener(object : View.OnClickListener {
        override fun onClick(v: View?) {
            toast("Hello")
       }
     })
    

    建议你用Lambda方法,转换:

    view.setOnClickListener({ v -> toast("Hello") })
    

    如果函数的最后一个参数是函数,它能够移到圆括号外面。
    如果我们有多个参数,其余的参数则在圆括号内,即使这些参数是函数。仅仅最后一个参数能够提出来。

    view.setOnClickListener() { v -> toast("Hello") }
    

    如果函数仅有一个参数,且它是一个函数,则圆括号能删除

    view.setOnClickListener { v -> toast("Hello") }
    

    如果你不用Lambda参数,你可以删除函数的左边部分
    如果你仅有一个参数这是正确。不使用视图(v),就可以删除它:

    view.setOnClickListener { toast("Hello") }
    

    另外,在函数仅接收参数,则不是在左边定义,而是用保留字it,节省一些字符。
    例如,如果我们用视图传递它到另一个方法:

    view.setOnClickListener { v -> doSomething(v) }
    
    我们可以选择简单的用it:
    view.setOnClickListener { doSomething(it) }
    

    7,接口回调的三种写法

       public interface OnSelectedListener {
            void onSelected(int position,ListValueBean bean);
        }
    
    函数.png
    dialog.setListener { position, bean -> 
                    
     }
    
      dialog.setListener(object : BottomListDialog.OnSelectedListener{
         override fun onSelected(position: Int, bean: BottomListDialog.ListValueBean?) {
                                         
     }
      })
    
     dialog.setListener(object : ((Int,BottomListDialog.ListValueBean) -> Unit){
          override fun invoke(p1: Int, p2: BottomListDialog.ListValueBean) {
                        
      }
        })
    
    
    

    8, 高阶函数(Higher-Order Functions)
    将函数作为参数或返回一个函数,称为高阶函数。
    如“lock()”函数,给对象和函数提供锁功能,获取锁,执行函数,释放锁。

    fun <T> lock(lock: Lock, body: () -> T): T {
      lock.lock()
      try {
        return body()
      }
      finally {
        lock.unlock()
      }
    
    

    该函数的参数“body”是一个函数类型:“() -> T”,表示为一个函数,没有入参,返回一个“T”的值。

    通过下面方式调用,需要传入一个函数类型参数:

    fun toBeSynchronized() = sharedResource.operation()
     
    val result = lock(lock, ::toBeSynchronized)
    
    

    另外,也使用使用Lambda表示方式:

    val result = lock(lock, { sharedResource.operation() })
    
    

    9,Lambda表达式:
    Lambda表达一般使用“{ }”包围。
    它的参数(如果有的话)在“->”前定义,参数类型可能是省略的。
    函数体跟在“->”后面。

    在Kotlin中,若函数最后一个参数为函数类型,调用时,该参数可以放到函数“()”的外面:

    lock (lock) {
      sharedResource.operation()
    }
    
    

    另一个高阶函数例子“map()”:
    泛型 T 转成R ,传入T,返回R

    fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
      val result = arrayListOf<R>()
      for (item in this)
        result.add(transform(item))
      return result
    }
    
    

    for循环

    普通的for循环
    Val s = “我是中国人”
    for (c in s ) {     //in s  找到s字符串里面所有的字符
        println("c=$c")
    }
    加上index角标的for循环   
    for ((index,c) in s.withIndex()) {    //需要找到字符,并且还需要找到字符位置
        println("index=$index c=$c")
    }
    
    
    增强Foreach循环
    普通foreach
    Val s = “我是中国人”
    s.forEach {
            println("it=$it")      //it代表每一个字符
    }
    加上index角标的foreach
    s.forEachIndexed { index, c ->
            println("$c 的角标是$index")
    }
    
    

    Continue和break的区别

    Continue跳出这次循环,后面还会执行
        var newstr = "abcde“
        for (c in newstr) {
                if(c=='c') continue
                println(c)   //输出 a b d e,不会输出c
            }
    Break跳出循环,循环停止
    for (c in newstr) {
            if(c=='c') break
            println(c)    //只输出a b 后面都不会输出
        } 
    
    
    标签Looper ,用于多个for循环嵌套,跳出标签的for循环
      Looper@for (c in s1){
                for (b in s2){
                    if (b == '2'){
                        break@Looper
                    }
                }
            }
    
    

    区间 Range

    常见区间:IntRange  CharRange  LongRange
    区间创建
    IntRange(1,10)
    1..100  //[1,100]
    1 until 100//[1,100)  
    区间遍历:for  foreach
    反向区间:10 downTo 5
    区间反转:intRange.reversed()
    
    

    数组的定义

    相同数据类型的元素按照一定顺序排列的集合
    创建数组:arrayOf("haha",10,20)
    创建基本数据类型数组
    intArrayOf(10, 20, 30)
    booleanArrayOf(true,false,true)
    byteArrayOf(10,20)
    …注意:没有stringArrayof
    
    
    数组元素修改
    var newArr = arrayOf(1,2,3,4,2,3,5)
    修改某一个位置上的元素
        newArr[0] = 20  //将角标0元素值设置为20
            newArr.set(4,20)//将角标4元素值设置为20
    查找数组元素角标
    var arr = arrayOf(1,2,3,4,2,3,5)
    查找第一个元素2
    第一种:  arr.indexOf(2)
    第二种:  arr.indexOfFirst {
                 it==2  }         
    查找最后一个元素2
    第一种:  arr.lastIndexOf(2)
    第二种:arr.indexOfLast {
         it == 2  }
    
    

    when的使用

    fun todo1(age:Int):String{
            when(age){
                
                12 -> {
                    return "12"   
                }
                
                in 16..18 ->return "13"
    
                else->{
                    return "333"
                }
            }
    
      when{
                age == 18 ->{
                    return "111"
                }
    
                age is Int -> return "222"  
                
                else ->return "111"
            }
    

    可变参数

      //2,可变参数 ,params 是数组类型
        fun vara(vararg params:Int):Int{
           
            return 1
        }
    

    相关文章

      网友评论

          本文标题:Kotlin学习(三) : 函数

          本文链接:https://www.haomeiwen.com/subject/oggziftx.html