学过javascript的同学可曾记得,javascript允许将匿名函数作为参数送给函数,典型的使用场景就是
setTimeout(function () { // 自定义处理事件 }, 5000)
后来在es6中出现了lambda的使用方式,上式就可以改写为:
setTimeout(() => { // 自定义处理事件 }, 5000)
但是在java8以前一直没有这种写法,要想实现自定义回调方式,就必须通过java中的abstract类与abstract函数实现,比如我们要想调用一个函数,等函数处理完后,执行自定义的函数
1.首先需要定义一个abstract类,如下:
public abstract class TestClass{ public abstract void callback(String res); }
2.另一个类中有这样一个函数,将之前的抽象类作为参数
public void CallFunc(TestClass tc) { // 自定义代码 tc.callback(res); };
3.调用的时候将抽象类作为参数送进去,如:
CallFunc(new TestClass() { @Override public void callback(String res) { // 自定义处理逻辑,如 System.out.println(res); } });
这个方法其实也可以,但是如果使用了lambda特性,就不需要new一个新的class了。下面我就来介绍下lambda特性。
首先,利用lambda特性,上面调用的函数可以写成:
CallFunc((res) -> { // 自定义处理逻辑,如 System.out.println(res); });
这样的表达唯一的坏处就是只能回调一个函数,感觉写法也没有精炼很多。
另外,需要注意的是,lambda表达式是对interface的实现,因此参数必须是一个interface或是一个继承了interface的class。
并且由于lambda表达式没有函数名,因此那个被实现的interface只能显式声明一个抽象方法。
实现这个方式需要如下几步:
第一步:新建一个interface文件
package Lambda; @FunctionalInterface public interface LambdaTest { void callback(String res); }
第二步:修改CallFunc函数为
public void CallFunc(LambdaTest lt) { // 自定义代码 lt.callback(res); };
第二步:修改调用函数如下
CallFunc((res) -> { // 自定义处理逻辑,如 System.out.println(res); });
大家对比可以看到,主要是抽象类与接口的使用方式而已,一个是通过抽象类实现的,一个是通过接口实现的。
文章作者:沃航科技