一、为什么会有Lambda表达式
目前各种语言中都出现了函数编程的概念,这个留给大家去了解下。
自从JDK1.8之后,Java中支持了Lambda表达式,给函数式编程了一个实现的机会。
用了Lambda表达式后,你的代码会比你想象起来的简洁的多。
二、实战
Talk is cheap,Show me the code!
我们定义一个接口,里面只能有一个方法,是默认方法,在接口上我们添加注解@FunctionalInterface
。这就是传说中的函数式接口。
@FunctionalInterface
public interface TestInterface {
public String write(String name);
}
我们有一个方法,需要使用如上的接口中的方法的功能:
public static void test (TestInterface testInterface) {
String name ="jxl";
System.out.println(testInterface.write(name));
}
那么问题来了,我们现在想要调用test方法,我们需要一个实现了TestInterface
接口的类,可是有了Lamdba表达式,我们只需要像以下这样做,以下test方法中,写了一段代码,就是用来定义上面的那个接口的实现类的,是不是很像匿名内部类呢,但是他可是定义了接口中的那个默认的方法的实现的,所以为什么说是函数式编程的呢!
public static void main(String[] args) {
test((String name) -> {
System.out.println(name);
return "heihei";
});
}
三、使用场景
你可能会问,代码是简单了,可是如果我们的实现类被很多次使用呢?对了,说明咱们思考了。
Lambda表达式的使用场景:代码只在一处调用,而且代码比较简单,否则是不适用Lambda表达式的。
四、总结
- 我们来分析下以上的用例,本来test方法需要一个实现了接口
TestInterface
的类的对象传入的,而我们使用了Lambda表达式,我们只需要在括号中定义这个类即可。 - 形式为(参数1, 参数2, …)->{代码块},也就是我们不需要接口中的方法的名字,只需要参数和实现的代码块即可。
- 还有个问题,我们只是传递了对象,这个对象的方法是否调用,要看test方法中是否调用了write方法。
五、测试
我们可以测试下代码改成如下,会有什么样的打印效果?
@FunctionalInterface
public interface TestInterface {
public String write(String name);
}
public static void test (TestInterface testInterface) {
String name ="jxl";
System.out.println(name);
}
public static void main(String[] args) {
test((String name) -> {
System.out.println(name);
return "heihei";
});
}
如果我们猜对了,说明我们队Lambda表达式比较清楚了。