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)
上一篇 2026年1月22日 下午1:43
下一篇 2026年1月22日 下午2:15


相关推荐

  • 独立成分分析ICA系列2:概念、应用和估计原理.

    独立成分分析ICA系列2:概念、应用和估计原理.1.概念独立成分分析是从多元(多维)统计数据中寻找潜在因子或成分的一种方法.ICA与其它的方法重要的区别在于,它寻找满足统计独立和非高斯的成分。这里我们简要介绍ICA的基本概念、应用和估计原理。1.1 多元数据的线性表示统计数据处理及相关领域中的一个重要和需要长期研究的问题就是,寻找多元数据一个恰当的表示,使得人们可以获得给定数据的本质特征或者使得数据的结构

    2022年5月17日
    42
  • preparedStatement介绍

    preparedStatement介绍PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时PreparedStatement还

    2022年6月11日
    51
  • CVE-2022-23131——绕过 SAML SSO 身份验证

    CVE-2022-23131——绕过 SAML SSO 身份验证漏洞描述安全断言标记语言 SAML 是最常见的单点登录 SSO 标准之一 围绕 XML 实现 它允许身份提供者 IdP 一个能够对用户进行身份验证的实体 告诉服务提供者 SP 这里是 Zabbix 你是谁 您可以将 ZabbixWeb 前端配置为允许通过 SAML 进行用户身份验证 但默认情况下不启用它 因为它需要了解身份提供者的详细信息 这是企业部署最常见的设置 在启用 SAMLSSO 身份验证的实例上 它允许绕过身份验证并获得管理员权限 攻击者可以使用此访问权限在链接的 ZabbixSer

    2026年3月26日
    2
  • [特殊字符] Nano-Banana实战教程:为小米生态链产品定制拆解图生成流程

    [特殊字符] Nano-Banana实战教程:为小米生态链产品定制拆解图生成流程

    2026年3月14日
    3
  • 国产AI大模型全解析[项目代码]

    国产AI大模型全解析[项目代码]

    2026年3月14日
    2
  • 重庆java培训机构哪个好_java培训班

    重庆java培训机构哪个好_java培训班前言说到CAS(CompareAndSwap),不得不先说一说悲观锁和乐观锁,因为CAS是乐观锁思想的一种实现。悲观锁:总是很悲观的认为,每次拿数据都会有其他线程并发执行,所以每次都会进行加锁,用完之后释放锁,其他的线程才能拿到锁,进而拿到资源进行操作。java中的synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。乐观锁:总是很乐观认为,自己拿到数据操作的时候,没有其他线程来并发操作,等自己操作结束要更新数据时,判断自己对数据操作的期间有没有其他线程进行操作,如果有,则

    2022年10月4日
    3

发表回复

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

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