Java,Kotlin,Dart中实现回调的区别

实现回调首先要弄清楚几个概念: 匿名函数,Lambda表达式,函数类型,高阶函数

匿名函数:多数函数是有名字的, 也可以创建没有名字的函数,这种函数被称为 匿名函数。
Lambda表达式:匿名函数的另一种替代写法,被称为 lambda 或者 closure 。
函数类型 :如果一个变量的类型是函数,那么这个变量是函数类型,
高阶函数:参数或者返回值可以是函数类型的函数

Java回调实现

Java 8中新增了Lambda表达式和函数可以作为值。Lambda表达式由参数、箭头和主体组成;函数作为值是,通过使用方法引用 :: 语法(即“把这个方法作为值”)来传递。Java 的Lambda表达式是在函数式接口上实现的,函数式接口就是只定义一个抽象方法的接口。不像Dart和Kotlin有函数类型,所以Java 实现回调很麻烦,需要先定义接口。如: Runnable接口

Runnable接口的实现:匿名函数写法或者Lambda表达式形式

new Runnable() {  
    public void run() {  
    //your code
        }  
}
//或者
() -> { //your code}

Java的Lambda的基本语法是

//单条语句
(parameters) -> expression
//或(多条语句)
(parameters) -> { statements; }

Java中回调的定义和回调的使用

	/*----回调定义----*/
    static class CallBackImp {
        interface CallBack {
            void callBack(int code, String msg);
        }

        void callBackMethod(CallBack callBack) {
            callBack.callBack(1, "msg");
        }
    }
    /*----回调使用----*/
        //回调用匿名类调用
        new CallBackImp().callBackMethod(new CallBackImp.CallBack() {
            @Override
            public void callBack(int code, String msg) {
                //your code
            }
        });
        //回调用lambda
        new CallBackImp().callBackMethod((code, msg) -> {
            //your code
        });

Kotlin回调实现

Kotlin的Lambda的基本语法是

{ [[Type] param1[,]] ->
      codeBlock
 }

Kotlin中回调的定义

	/*----回调定义----*/
class CallBackImpByKotlin {
    interface CallBack {
        fun callBack(code: Int, msg: String)
    }

    //回调不能为空
    fun callBackMethod1(callBack: (code: Int, msg: String) -> Unit) {
        callBack.invoke(1, "msg")
    }

    //回调可以为空
    fun callBackMethod2(callBack: ((code: Int, msg: String) -> Unit)?) {
        callBack?.invoke(1, "msg")
    }

    //有返回值的回调
    fun callBackMethod3(callBack: ((code: Int, msg: String) -> Boolean)) {
        callBack.invoke(1, "msg")
    }

    fun callBackMethod4(callBack: CallBack) {
        callBack.callBack(1, "msg")
    }
}

Kotlin中回调的使用

//回调用lambda
CallBackImpByKotlin().callBackMethod1 { code, msg ->
    //your code
}
//有返回值的回调匿名函数写法
CallBackImpByKotlin().callBackMethod3(fun(code, msg): Boolean {
    return true
})
//有返回值的回调lambda写法
CallBackImpByKotlin().callBackMethod3 { code, msg ->
    return@callBackMethod3 true
}
//错误的匿类写法  ---------报错-------------
CallBackImpByKotlin().callBackMethod4(CallBackImpByKotlin.CallBack() {
    @Override
    fun callBack(code: Int, msg: String) {

    }
})
//不像java能用lambda代替匿名类 ---------报错-------------
CallBackImpByKotlin().callBackMethod4 { code, msg ->
    //your code
}
//是不是很抓狂,到底要我怎么写

//Kotlin匿名类的正确写法
CallBackImpByKotlin().callBackMethod4(object : CallBackImpByKotlin.CallBack {
    override fun callBack(code: Int, msg: String) {
        //your code
    }

})

Dart回调实现

Dart 的Lambda的基本语法是

([[Type] param1[,]]) { 
  codeBlock; 
}; 

Dart 中回调的定义

//xx.dart文件
//typedef 只能定义在class CallBackImp外面,要在 top level;note:这个是为callBackMethod2中回调定义
typedef CallBack = void Function(int code, String msg);

class CallBackImp {
  ///通过var来实现回调
  void callBackMethod1(var callBack) {
    callBack(1, "msg");
  }

  ///通过typedef 定义Function 别名 来实现回调
  void callBackMethod2(CallBack callBack) {
    callBack(1, "msg");
  }

  ///通过定义函数类型
  void callBackMethod3(void callBack(int code, String msg)) {
    callBack(1, "msg");
  }

  ///callBackMethod3的另一种写法,返回值void可以省略不写,参数类型可以推断得出也可以省略不写
  void callBackMethod4(callBack(code, msg)) {
    callBack(1, "msg");
  }
}

Dart 中回调的使用

  new CallBackImp().callBackMethod1((int code, String msg) {
    //your code
  });

  new CallBackImp().callBackMethod2((int code, String msg) {
    //your code
  });
  new CallBackImp().callBackMethod3((int code, String msg) {
    //your code
  });

  //和上面的不同,不能加上具体的类型声明
  new CallBackImp().callBackMethod4((code, msg) {
    //your code
  });
  //或者
  new CallBackImp().callBackMethod4((var code, var msg) {
    //your code
  });

总结:主要区别是能否定义函数变量,Dart和Kotlin支持函数变量,Java8 不支持,回调的实现需要定义接口,不是很方便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值