kotlin 内联函数思考

java中的AnimatorListener

public void addListener(AnimatorListener listener){
  if(mListner==null){
    mListener=new ArrayListener();
  }
  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 内联函数思考)