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

java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda…我们都知道,java8之后增加了很多新特性,大大的简化了代码的编写、阅读的负担。先发个牢骚:今天up主根据自己的理解跟大家说说新特性之一的lambdaexpress(拉姆达表达式),每当看到新的语法改动,内心我都是拒绝的。因为又要学习、又要适应、又要改变真烦人,可是没办法现在这几乎是所有大厂必须的操作。总不能看不懂人家写的代码吧,做IT行业尤其是软件工程师必须要保证自己的知识及时更新、知识面不…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

我们都知道, 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的同学们,大家一起努力。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191938.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 失眠的反思

    失眠的反思

    2021年8月11日
    55
  • A卡福利 : AMD Fluid Motion Video补帧教程,让你的视频从24帧补到60帧(144)

    A卡福利 : AMD Fluid Motion Video补帧教程,让你的视频从24帧补到60帧(144)背景:AMDFluidMotionVideo是一项AMD研发,将帧率为24FPS【即帧每秒,FramesperSecond】或者其他帧率低于60FPS的视频补帧成60帧的技术。1.准备工具:完美解码(Potplayer),BuleskyFrc2.打开AMD的深红驱动设置,依次点击"视频"-"自定义"-"AMDFluidMotionVideo…

    2022年9月14日
    3
  • 字符串/数组截取汇总

    字符串/数组截取汇总字符串/数组截取汇总每次都忘记具体的截取方式,还是总结一下加深记忆比较好~一、JS方式1.slice:取得字符串或数组中的一段形式:arrayObject.slice(start,end);返回值:返回一个新的数组,包含从start到end(不包括该元素)的arrayObject中的元素。不改变原数组eg:输入var…

    2022年5月4日
    37
  • cpu参数_CPU核心参数有哪些

    cpu参数_CPU核心参数有哪些文章目录CPU功能:CPU的组成:CPU参数:几个重要概念计算机的存储层次:RegisterCache睿频加速技术:超线程技术:CPU功能: 要完成一个任务,先编写一段程序,然后存入计算机主存。程序的代码就会翻译成一条条指令或数据字。cpu就会执行这些指令得到最终结果。读取指令要通过地址读取,地址保存在程序计数器中,读取的某个任务的全部指令会放入指令寄存器等待处理,cpu每次从中读取一条指令或…

    2025年6月17日
    1
  • 最小二乘法原理和推导过程「建议收藏」

    最小二乘法原理和推导过程「建议收藏」对于有误差的统计值,我们一般都是采用均值作为使用值。但是这种使用均值代替的方式是不是合理?为什么不用中位数、几何平均数什么的?这需要一个解释。1.什么是二乘?对于一列数字,比如10.1、…

    2022年5月17日
    55
  • VirtualBox命令行接口VBoxManage配置「建议收藏」

    VirtualBox命令行接口VBoxManage配置「建议收藏」VBoxManage是VirtualBox的命令行接口,你可以在主机操作系统的命令行中完全地控制VirtualBox。VBoxManage支持GUI可访问的全部功能,而且更多。VBoxManage展示了虚拟化引擎的全部特征,包括GUI无法访问的。使用VBoxManage前需配置环境变量:1,在系统变量里面添加variable:VBoxManage        

    2022年5月27日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号