美文网首页
kotlin 内联函数思考

kotlin 内联函数思考

作者: 王怀智 | 来源:发表于2020-05-19 18:28 被阅读0次

    java中的AnimatorListener

    public void addListener(AnimatorListener listener){
      if(mListner==null){
        mListener=new ArrayListener<AnimatorListener>();
      }
      mListener.add(listener)
    }
    
    
    public static interface AnimatorListener{
      void onAnimationStart(Animator animation);
      void onAnimationEnd(Animator animation);
      void onAnimationCancel(Animator animation);
      void onAnimationRepeat(Animator animation);
    }
    

    kotlin中的AnimatorListener(扩展)

    inline fun Animator.addListener(
      crossinline onEnd:(animator: Animator)->Unit={},
       crossinline onStart: (animator: Animator) -> Unit = {},
        crossinline onCancel: (animator: Animator) -> Unit = {},
        crossinline onRepeat: (animator: Animator) -> Unit = {}
    ):Animator.AnimatorListener{
      val listener=object:Animator.AnimatorLisener{
         override fun onAnimationRepeat(animator: Animator) = onRepeat(animator)
            override fun onAnimationEnd(animator: Animator) = onEnd(animator)
            override fun onAnimationCancel(animator: Animator) = onCancel(animator)
            override fun onAnimationStart(animator: Animator) = onStart(animator)
      }
      addListener(listener) //调用系统的addListener
      return listener
    }
    
    

    kotlin 添加内联函数

    方法被调用,压栈出栈耗费资源,所以有了inline关键字,
    在编译期间,定义为inline关键字的方法,会被视为调用者的内容方法体,不会有压栈,出栈操作,进而减少资源消耗。

    inline

    定义内联函数的关键字

    noinline

    定义为inline的函数体内,它的参数也是函数,再调用非inline函数,传入它的(函数)参数时,是不允许被使用,如果需要使用,需要在形参上添加noinline关键字。注:{除了函数参数以外的是可以被访问}

    例子

    fun converRep(conver: (String) -> Unit) {}
    
    inline fun meetInline(s: String, noinline conver: (String) -> Unit) {
        converRep(conver)
    }
    

    crossinline

    crossinline的作用是内联函数中被标记为crossinline的lambda表达式不允许"非局部返回"。

    函数中的lambda不允许直接非局部返回,只能返回当前lambda表达式,return@lambda

    例子

    fun converRep(conver: (String) -> Unit) {}
    
    fun crossTest(){
      converRep{
        // return 不被允许
        return@converRep 只是返回了lambda表达式,并不影响converRep函数的运行
      }
    }
    

    inline修饰的例子

    inline fun converRep(conver: (String) -> Unit) {}
    
    fun crossTest(){
      converRep{
        return 被允许,直接return 整个函数被return
      }
      println("return之后,将不会输出")
    }
    

    crossinline修饰的例子

    inline fun converRep(crossinline +conver: (String) -> Unit) {}
    
    fun crossTest(){
      converRep{
        // return 将不被允许
        return@converRep 只能使用这种方式
      }
      println("return@之后,会正常输出")
    }
    

    相关文章

      网友评论

          本文标题:kotlin 内联函数思考

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