您好,欢迎访问沃航(武汉)科技有限公司官方网站
java8新特性lambda的使用
2019-06-22 13:46:04

学过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);
});

大家对比可以看到,主要是抽象类与接口的使用方式而已,一个是通过抽象类实现的,一个是通过接口实现的。


文章作者:沃航科技

联系我们
地址:
武汉市洪山区蓝晶国际7栋903
QQ:
932773931
电话:
027-59761089-806
手机:
13397158231
邮箱:
jevian_ma@worldflying.cn
×
物联网组态平台
试用账号:123456
试用密码:123456
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn
×
积木编程平台
试用方式:试用手机号码注册即可使用
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn