多线程并发基础外传之lambda表达式

643 阅读2分钟

1. 写在前面

为什么扯到了lambda?其实也是和Runnable接口有关系。其实,Runnable是一个函数式接口,可以用lambda表达式来创建其对象。

2. lambda表达式简介

总体来说,lambda属于函数式编程的概念,它可以避免匿名内部类定义过多,也可以简化代码

关于函数式编程的概念,对我来说还算模糊,所以不在这里误导大家了,那么函数式接口,是什么意思呢?其实,函数式接口,就是只包含一个抽象方法的接口。两个重点,“一个”还有“抽象”。

那么,对于函数式接口,我们就可以使用lambda表达式来创建该接口的对象

3. 看个例子吧

其实在这里,最经典的例子,还是Runnable接口。我们可以看下Runnable接口的定义

image.png 在这个接口里面,只有一个抽象方法run,所以Runnable接口就是一个函数式接口。那么我们怎么通过lambda表达式进行简化呢

不用lambda表达式,怎么创建线程(匿名内部类)
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("我是线程");
    }
});
用lambda表达式,怎么创建线程
Thread thread = new Thread(() -> System.out.println("我是线程"));
thread.start();

我们发现,直接用一对括号表示参数,加个箭头,指向函数体,就可以不用写一个匿名内部类了。

4. 还不懂?没关系,我们再看个例子

首先我们定义一个函数式接口。

interface MyInterface {
    public abstract void doSomething(int a);
}
用匿名内部类创建其对象
MyInterface myInterface = new MyInterface() {
    @Override
    public void doSomething(int a) {
        System.out.println("做点啥吧");
    }
};
myInterface.doSomething(1);
用lambda表达式创建其对象
MyInterface myInterface = (int a) -> System.out.println("做点啥吧");
myInterface.doSomething(1);

其实这里的lambda表达式还可以简化,并且当函数体不只是一行代码的时候,花括号也不可省略了。但细节的就不再多介绍了,毕竟,这里只是一个入门文章,只要懂了lambda表达式怎么来的,以及它的定义,那这篇文章就实现它的价值了。

5. 总结一下

Runnable是一个函数式接口,在创建对象时可以用lambda表达式简化,lambda表达式既可以避免匿名内部类定义过多,也可以用来简化代码。