我们都知道, java8之后增加了很多新特性,大大的简化了代码的编写、阅读的负担。
先发个牢骚:
今天up主根据自己的理解跟大家说说新特性之一的lambda express(拉姆达表达式),每当看到新的语法改动,内心我都是拒绝的。因为又要学习、又要适应、又要改变真烦人,可是没办法现在这几乎是所有大厂必须的操作。总不能看不懂人家写的代码吧,做IT行业尤其是软件工程师必须要保证自己的知识及时更新、知识面不但要广而且还要专。只有这样才不会被日新月异所淘汰,熟不知现在JDK都升级了14了,我们连jdk8都还没搞明白岂不是太说不过去了。要记住:危机感、危机感、危机感
1. 什么是lambda表达式?
说白了就是匿名函数的简单抽象,那啥是匿名函数啊?
百度是这么说的:匿名函数不以文件形式驻留在文件夹上;他的生成方式最简捷,可在指令窗或任何函数体内通过指令直接生成。
说白了就是没有单独的方法定义结构,可在任何方法直接通过 new的方式进行创建使用。那下面代码举例:
//定义一个普通的接口FunInterface1 里面有一个抽象方法m1() ,常规做法我们想用接口中的方法必须要通过关键字implements对其接口进行实现,然后重写m1方法。其实更简单的调用可以用匿名函数的方式实现,代码如下:
interface FunInterface1 {
void m1();
}
interface FunInterface2 {
int m2(int a,int b);
}
public class NoNameFun {
public static void main(String[] args) {
FunInterface1 fun1 = new FunInterface1() {
@Override
public void m1() {
System.out.println("我是m1的具体实现!");
}
};
fun1.m1();
}
}
以上是常规的匿名函数的调用,那我们用java8 的lambda的方式从写一下,对比看看:
FunInterface1 fun2 = ()->{System.out.println("我是m1");};
fun2.m1();
我们发现用lambda的方式改进后变成了两行代码, 是不是大大的简化了程序的阅读性。其中()代表了函数的参数部分,由于m1是无参的所以是空的。->表示指向的意思,{}大括号中写具体业务逻辑实现代码。从以前的new FunInterface1()简化为()-> 。
调用有参数的接口方法代码如下:
FunInterface2 fun3 = (int a,int b)->{return a+b;};
System.out.println(fun2.m2(3,5)); //结果输出8
是不是很简洁,好的东西我们一定要学习。我们再看一个线程的例子:
new Thread(()->{
System.out.println("线程执行体");
},"线程名称").start();
就几行代码就创建好了一个线程。很easy吧,动起手来尝试一下。
2. 为什么lambda表达式不用写函数名称?
相信大家看完上面的代码会有疑惑。
为什么不写函数名称lambda就知道要实现哪个方法呢?
首先lambda表达式使用的时候是有要求的,如果接口有且仅有一个方法(default、static除外一会详解),那么可以直接使用。因为只有一个(only one)方法,所以编译器会直接知道要实现哪个方法。如果多于一个方法,那么在使用lambda表达式的时候会报编译错误,例我们在FunInterface1 又新增抽象方法m2(),会出现以下错误:多个没有重写的抽象方法被发现
所以为了避免以上问题,java标准规范中定义说,函数式接口需要用@FunctionalInterface注解来标示。如果接口中只有一个方法,那么不加注解,编译器会自动识别。如果FunInterface1 加上了@FunctionalInterface注解,那么会直接报编译错误,不允许增加第二个抽象方法,不符合标准规范。那么真的不能加第二个甚至更多的方法嘛,很显然不是的。java8还新增了static、default这两种修饰的接口方式,就是说从java8开始,接口中方法可以有自己的实现体了,代码如下:
default和static类型的方法可以有多个
更神奇的是,可以与@FunctionalInterface兼容。允许一个函数式接口中有且仅有一个抽象方法,多个default方法和多个static方法。代码如下:没有编译错误,且能正常执行
不得不说java编程语言的强大,灵活可扩展。
如何调用?我们以FunInterface3接口为例
注意static方法的调用形式
2.如何熟练使用lambda表达式?
总结个口诀:
1.接口引用先
2.之后方法参
3.一横右箭头
4.大括号来实现
总结:第一次写文章,逻辑性和表达性欠缺希望大家能多多体谅。也希望此文能帮助到正在学习Java的同学们,大家一起努力。