java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda...

我们都知道, 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(),会出现以下错误:f43b1a3e6f2a32ba9b8d30b317104484.png多个没有重写的抽象方法被发现

所以为了避免以上问题,java标准规范中定义说,函数式接口需要用@FunctionalInterface注解来标示。如果接口中只有一个方法,那么不加注解,编译器会自动识别。如果FunInterface1 加上了@FunctionalInterface注解,那么会直接报编译错误,不允许增加第二个抽象方法,不符合标准规范。那么真的不能加第二个甚至更多的方法嘛,很显然不是的。java8还新增了static、default这两种修饰的接口方式,就是说从java8开始,接口中方法可以有自己的实现体了,代码如下:

b47f1abb0daaf2477829387337827c19.pngdefault和static类型的方法可以有多个

更神奇的是,可以与@FunctionalInterface兼容。允许一个函数式接口中有且仅有一个抽象方法,多个default方法和多个static方法。代码如下:ae08475d69f3f0e8aa03044a3f7a7bd3.png没有编译错误,且能正常执行

不得不说java编程语言的强大,灵活可扩展。

如何调用?我们以FunInterface3接口为例

1cbc1f6a9cdada44c3947488a089bd11.png注意static方法的调用形式

2.如何熟练使用lambda表达式?

总结个口诀:

1.接口引用先

2.之后方法参

3.一横右箭头

4.大括号来实现

总结:第一次写文章,逻辑性和表达性欠缺希望大家能多多体谅。也希望此文能帮助到正在学习Java的同学们,大家一起努力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值