现在才开始关注lambda表达式是不是有点过时了?毕竟这是jdk8加入的特性之一,现在jdk的版本迭代的速度是非常之快的,现在已经是jdk13了吧。但是jdk8作为在语言层面改动程度最大的一版,并且是在现代企业开发中应用最广泛的jdk版本,了解其中的一些特性也是必不可少的,并且也是十分必要的。
使用匿名内部类
当我们的方法中有一个对象类型的形参时,我们可以这样调用。
假设我们定义了一个People类
public class People {
String name;
int age;
String sex;
}
我们可以这样去调用它
public class Main {
// 1
public static void main(String[] args)
{
Test1 test1 = new Test1();
People p = new People();
test1.getPeople(p);
return;
}
// 2 直接new People而不需要一个形参名来替代
public static void main(String[] args)
{
Test1 test1 = new Test1();
test1.getPeople(new People());
return;
}
}
更常见的匿名内部类调用如下,这是我们通常意义下的匿名内部类
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent actionEvent){
System.out.println("Action detected");
}
});
一个接口,并重写其方法
为什么我们会用lambda表达式去代替匿名内部类的使用呢?正如你将要看到的,使用Lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多
如何去使用lamada表达式
我们先看看将上述转化为lambda表达式的样子
button.addActionListener(
(x)->{ System.out.println("Action detected");}
});
- 自定义函数式接口
从字面意思我们可以理解到,这里我们把一个接口函数化,例如我们上述操作的那样。本来是通过一个new ActionListener()
这样来传递参数的,现在我们通过lambda表达式,直接写成了一个类似于函数的方式,通过一个函数的实现来表达这个接口函数的参数。其实也很容易理解,函数式接口,即在一个接口下面有且仅有一个抽象接口方法,并用@FunctionalInterface声明
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
然后我们新开线程时就可以这样调用
Thread t = new Thread(()->{
System.out.println("Action detected");
});
当然lamada表达式的使用和理解是需要熟练和坚持使用,虽然不想在其它语言中被开发者大规模的使用,但当我们真正的掌握了这种编写风格时,就会深深的喜欢上它 >.<