Lambda表达式浅析(一)
作者:互联网
lambda表达式是JDK8所带来的新特性,它主要涉及到对在通过匿名内部类创建对象时所遇到的代码臃肿的问题进行优化,说白了主要就是用来简化代码的。
但lambda表达式也要满足一定的条件才可以使用:
所调用的接口一定要是函数式接口,即该接口里面有且只能有一个方法,例如:
@FunctionalInterface // 声明该接口为函数式接口
interface itf{
void method();
}
其注解 @FunctionalInterface 可以将该接口标注为函数式接口,其实这就像是 @Override 注解一样,起一个校检作用,如果该接口里面定义了两个及以上方法,就会报错。但是里面可以定义常量和变量。
下面我们来看一个例子,我们创建了一个函数式接口Swim
package Singleton.LambdaTest;
/**
* @Classname Swim
* @Created by ST
* @Description TODO
* @Date 2019/9/17 21:24
*/
@FunctionalInterface
public interface Swim {
void swimming();
}
我们再创建一个比赛方法类,在类中定义一个start方法,将接口作为参数传进去,并在方法里调用接口里的方法
package Singleton.LambdaTest;
/**
* @Classname GameMethod
* @Created by ST
* @Description TODO
*
* 比赛方法
* @Date 2019/9/17 21:30
*/
public class GameMethod {
public static void start(Swim s){
s.swimming();
}
}
接下来我们写实现类
package Singleton.LambdaTest;
/**
* @Classname SwimTest
* @Created by ST
* @Description TODO
* @Date 2019/9/17 21:34
*/
public class SwimTest {
public static void main(String[] args) {
Swim swim1 = new Swim() {
@Override
public void swimming() {
System.out.println("开始游泳");
}
};
Swim swim2 = new Swim() {
@Override
public void swimming() {
System.out.println("游完了,好累啊!");
}
};
GameMethod.start(swim1);
GameMethod.start(swim2);
}
}
从上面的代码我们看到我们可以直接通过匿名内部类的方式,在Swim接口里重写swimming方法,并将等号右边第一个大括号里面的内容当作一个整体赋给Swim创建的对象swim1和swim2,通过类GameMethod调用start方法并在方法里通过传入不同的参数来实现方法的多态性。运行结果如下:
但我们同样可以看到匿名内部类这样的方式所带来的代码实在繁琐,又要新建对象又要重写方法什么的,虽然可以通过快捷键自动生成,但是对于项目来说还是太过臃肿,这里我们就可以使用lambda表达式来简化我们的代码,简化之后代码如下:
GameMethod.start(() -> {
System.out.println("我在lambda表达式里游泳");
});
嗯,就是只有这一行代码,也不用通过创建对象来进行传参,我会在第二章来简单介绍下lambda表达式的一些书写规范。
标签:Swim,void,接口,浅析,start,GameMethod,public,表达式,Lambda 来源: https://blog.csdn.net/Shuttengr/article/details/100940170