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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html左右循环滚动代码,不间断循环滚动效果的实例代码(必看篇)

    html左右循环滚动代码,不间断循环滚动效果的实例代码(必看篇)滚动测试/***@paraobj目标对象如:demo,deml1,demo2中的”demo”可任意,只要不重复**@paraspeed滚动速度越大越慢**@paradirection滚动方向包括:left,right,down,up**@paraobjWidth总可见区域宽度**@paraobjHeight总可见区域高度**@parafilePath存…

    2022年7月18日
    55
  • 回溯算法之N皇后问题[通俗易懂]

    回溯算法之N皇后问题[通俗易懂]问题描述什么是皇后问题八皇后问题(英文:Eightqueens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语

    2022年9月30日
    2
  • HTTP 500 Internal Server Error[通俗易懂]

    HTTP 500 Internal Server Error[通俗易懂]HTTP500InternalServerError

    2022年7月14日
    17
  • labelme怎么安装_putty安装教程

    labelme怎么安装_putty安装教程Labelme安装教程(基于anaconda)1.创建anaconda虚拟环境labelmecondacreate-nlabelmepython=3.6完成之后如图所示(由于我已经创建了labelme故这里用labelme1代替)激活环境:condaactivatelabelme执行完这一步会发现运行环境转移到了labelme,如果没有重新创建2.安装labelme所需要的依赖环境安装的时候使用pip或者conda都可以,两者之中有一个不行时尝试使用另一个,我在安装的时

    2025年10月27日
    3
  • qtreewidget用法_qtreewidgetitem

    qtreewidget用法_qtreewidgetitemTreeWidget形成的树形控件是比较简单易用的,经过这段时间的使用,有了一些了解,特意总结下来,以供参考:1.隐藏表头2.添加元素3.为节点添加CheckBox4.添加右键菜单5.消息响应6.QTreeWidget提供了一些方法

    2022年10月1日
    3
  • java编译和运行

    java编译和运行java应用程序的基本结构 编写源文件 保存源文件 额外附加 编译器(javac.exe) 解释器(java.exe)总结:假如我的B.java源文件在C:\Users\AUSU\Desktop\ts里面一般都是进入到这个目录里面编译解释编译:javacB.java解释:javaB注意:解释不可能以带目录的方式去运行程序,编译可以零…

    2022年6月14日
    29

发表回复

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

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