【Java函数篇】Java8中的Lambda表达式实战详解

文章标题

    • 什么是lambda表达式
    • Lambda表达式示例
    • Lambda表达式特点
    • 更多实战案例
      • 场景1:使用 lambda 表达式迭代列表并对列表项执行某些操作
      • 场景2:使用 lambda 表达式在 Java 中创建并启动线程
      • 场景3:使用 lambda 表达式向 GUI 组件添加事件监听器
    • Lambda表达式的优点
    • 总结

Lambda表达式在其他编程语言中经常见到,比如Scala、Python等,lambda其实就是数学中的字符λ,表示的就是函数抽象。

什么是lambda表达式

在一般的编程语言中,Lambda 表达式是一个匿名函数,即没有任何方法名称或标识符,只带有形式参数列表和函数体,参数列表和函数体之间用箭头(->)分隔。

**在Java中lambda表达式是表示函数式接口实例的表达式。**函数式接口的使用参考:【Java函数篇】Java8中函数接口Function使用详解

与 Java 中的其他类型类似,lambda 表达式也是有类型的,其类型是函数式接口类型。为了推断类型,编译器会查看 lambda 表达式中赋值语句的左侧。

lambda 表达式本身并不包含它正在实现哪个函数接口的信息。此信息是根据表达式的使用上下文推断出来的。

Lambda表达式示例

一个典型的 lambda 表达式语法如下:

(parameters) -> expression

例如,下面给出的 lambda 表达式接受两个参数并返回它们的和。根据 x 和 y 的类型,表达式的使用方式会有所不同。

  • If the parameters match to Integer the expression will add the two numbers.
  • If the parameters of type String the expression will concat the two strings.
(x, y) -> x + y

例如,我们有以下函数接口 Operator。它有一个方法 process(),该方法接受两个参数并返回一个值。

@FunctionalInterface
interface Operator<T> {T process(T a, T b);
}

也可以按照以下方式为此功能接口创建 lambda 表达式。请注意,我们可以创建方法实现并立即使用它们。我们不需要创建实现 Operator 接口的具体类 OperatorImpl。

Operator<Integer> addOperation = (a, b) ->  a + b;
System.out.println(addOperation.process(3, 3));     //Prints 6
Operator<String> appendOperation = (a, b) ->  a + b;
System.out.println(appendOperation.process("3", "3"));  //Prints 33
Operator<Integer> multiplyOperation = (a, b) ->  a * b;
System.out.println(multiplyOperation.process(3, 3));    //Prints 9

功能接口类型的两个很好的例子是 Consumer 和 BiConsumer 接口,它们在 Stream API 中被广泛用于创建 lambda 表达式。

Lambda表达式特点

lambda表达式可以有0、1、2、3等多个参数

(x, y) -> x + y
(x, y, z) -> x + y + z

lambda 表达式的主体可以包含零个、一个或多个语句。如果 lambda 表达式的主体只有一个语句,则大括号不是必需的,并且匿名函数的返回类型与主体表达式的返回类型相同。当主体中有多个语句时,这些语句必须用大括号括起来。

(parameters) -> { statements; }

参数的类型可以明确声明,也可以从上下文中推断出来。在上例中,addOperation 和 appendOperation 的类型是从上下文中派生出来的。

多个参数必须用括号括起来,并用逗号分隔。空括号用于表示一组空的参数。

() -> expression

当只有一个参数时,如果可以推断其类型,则不必使用括号。

a -> return a * a;
  • Lambda 表达式不能有 throws 子句。这是从其使用上下文和其主体推断出来的。
  • Lambda 表达式不能是泛型的,即它们不能声明类型参数

更多实战案例

下面列了一些Lambda表达式实际使用的场景和案例,你可以通过学习了解怎么去使用。

场景1:使用 lambda 表达式迭代列表并对列表项执行某些操作

在给定的示例中,我们遍历列表并在标准输出中打印所有列表元素。我们可以执行任何所需的操作来代替打印它们。

List<String> pointList = new ArrayList();
pointList.add("1");
pointList.add("2");
pointList.forEach( p ->  { System.out.println(p); } );

场景2:使用 lambda 表达式在 Java 中创建并启动线程

在给定的示例中,我们将 Runnable 接口的实例传递到 Thread 构造函数中。

new Thread(() -> System.out.println("My Runnable");
).start();

还记得在jdk7中是如何创建线程的吗:

// JDK7 匿名内部类写法
new Thread(new Runnable(){// 接口名@Overridepublic void run(){// 方法名System.out.println("Thread run()");}
}).start();

lambda表达式跟匿名内部类的作用是一样的,但比匿名内部类更进一步。这里连接口名和函数名都一同省掉了,写起来更加简洁。如果函数体有多行,可以用大括号括起来,就像这样:

// JDK8 Lambda表达式代码块写法
new Thread(() -> {System.out.print("Hello");System.out.println(" Hoolee");}
).start();

场景3:使用 lambda 表达式向 GUI 组件添加事件监听器

JButton button =  new JButton("Submit");
button.addActionListener((e) -> {System.out.println("Click event triggered !!");
});

以上是 java 8 中 lambda 表达式的非常基本的示例,接下来继续看看Lambda表达式的高级使用技巧。

Lambda表达式的优点

Lambda 表达式为 Java 带来了许多函数式编程的优势。与大多数 面相对象编程 语言一样,Java 是围绕类和对象构建的,并且只将类视为其一等公民。其他重要的编程实体(例如函数)则处于次要地位。

但在函数式编程中,我们可以定义函数,为其提供引用变量,并将它们作为方法参数传递等等。JavaScript 是函数式编程的一个很好的例子,我们可以在其中将回调方法传递给 Ajax 调用等等。

请注意,在 Java 8 之前,我们可以使用匿名类完成使用 lambda 表达式可以完成的所有操作,但它们使用非常简洁的语法来实现相同的结果。让我们看看使用这两种技术对相同方法实现的比较。

// 使用Lambda表达式
Operator<Integer> addOperation = (a, b) -> a + b;// 使用匿名内部类
Operator<Integer> addOperation = new Operator<Integer>() {@Overridepublic Integer process(Integer a, Integer b) {return a + b;}
};

总结

Lambda 表达式是一个非常有用的特性,并且从一开始就是 Java 所缺乏的。现在有了 Java 8,我们也可以借助它来使用函数式编程概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

88.【C语言】文件操作(5)

目录 文件的随机读写 1.fseek函数 代码示例 运行结果 2.ftell函数 代码示例 运行结果 3.rewind函数 代码示例 运行结果 承接79.【C语言】文件操作(4)文章 文件的随机读写 1.fseek函数 声明:int fseek ( FILE * stream, long int offset, int origin ); 格式:fsee…

APM 3.0.0|二次元味很冲的B站音乐软件

APM是一款专为B站音频设计的第三方播放器&#xff0c;支持从B站获取音频内容&#xff0c;提供桌面小组件&#xff0c;多语言支持&#xff0c;以及针对Android系统的优化。下载安装APK后打开应用&#xff0c;登录B站账号&#xff0c;浏览并播放音频内容。 大小&#xff1a;73M …

13分+文章利用scRNA-Seq揭示地铁细颗粒物引起肺部炎症的分子机制

写在前面 人们乘坐地铁时&#xff0c;不可避免地在地铁站台上吸入细颗粒物&#xff08;PM2.5&#xff09;&#xff0c;但PM2.5对人体又有哪些危害呢&#xff0c;今天和大家分享一篇文章&#xff0c;题目为“单细胞转录组学揭示吸入地铁细颗粒物引起的肺部炎症”&#xff0c;作…

Android:加载三方应用的小部件到自己APP显示

两种方式&#xff1a; 1、自己加载小部件列表做选择要显示的小部件 2、调用系统的弹窗做选择要显示的小部件 直接贴代码&#xff1a; public class TempActivity extends FragmentActivity {private ActivityTempBinding viewBinding;private AppWidgetManager appWidgetMa…

私域卖货难点如何解决

明确了品牌卖货的本质&#xff0c;我们来看一下私域品牌的卖货难点如何解决。 一、产品层面 想要提高卖货效率&#xff0c;第一步就是打造产品竞争力。产品竞争力的打造主要在于两点&#xff1a;市场调研和定期更新迭代&#xff0c;其中定期更新迭代则是打造产品竞争力的核心环…

《AI生成式工具使用》之:AI文本生视频(二战!)

目录 背景说明及目标 尝试练手 1、豆包AI之图片生成 总结&#xff1a;豆包AI生成的图片&#xff0c;不太能看细节&#xff0c;涉及到中文的基本上不能细看都是类似乱码的东西&#xff0c;有明显的逻辑性问题&#xff08;比如不符合道路交规&#xff09;。需要根据生成的结果…

超越 React Query:探索更高效的数据请求策略

你好&#xff0c;开发者们&#xff01; 在前端开发的海洋中&#xff0c;我们常常遇到组件间通信的难题。你是否也曾为如何优雅地在组件间传递信息而头疼&#xff1f;今天&#xff0c;我想和大家分享一个让我眼前一亮的解决方案——使用 alova。 跨组件触发请求的挑战 想象一…

Java-继承与多态-上篇

关于类与对象&#xff0c;内容较多&#xff0c;我们分为两篇进行讲解&#xff1a; &#x1f4da; Java-继承与多态-上篇&#xff1a;———— <就是本篇> &#x1f4d5; 继承的概念与使用 &#x1f4d5; 父类成员访问 &#x1f4d5; super关键字 &#x1f4d5; supe…

Windows设置程序开机自启动的几种方法

1. 使用“启动”文件夹 Windows 有一个专门的“启动”文件夹&#xff0c;所有放在这个文件夹中的程序都会在系统启动时自动运行。 步骤&#xff1a; 按下 Win R&#xff0c;输入 shell:startup&#xff0c;并按下回车。 在弹出的启动文件夹中&#xff0c;将你想要开机自启动…

laravel 查询数据库

数据库准备 插入 三行 不同的数据 自行搭建 laravel 工程 参考 工程创建点击此处 laravel 配置 数据库信息 DB_CONNECTIONmysql #连接什么数据库 DB_HOST127.0.0.1 # 连接 哪个电脑的 ip &#xff08;决定 电脑 本机&#xff09; DB_PORT3306 # 端口 DB_DATABASEyanyu…

PostgreSQL模板数据库template0和template1的异同点

PostgreSQL模板数据库 PostgreSQL有两个模板数据库&#xff1a;template0和template1&#xff0c;template0是不可修改的&#xff0c;而template1是可以修改的。 那模板数据库有什么作用呢&#xff1f;顾名思义&#xff0c;当做模板。 其实我们创建数据库 CREATE DATABASE 其…

【记录】VSCode|自用设置项

文章目录 1 基础配置1.1 自动保存1.2 编辑区自动换行1.3 选项卡换行1.4 空格代替制表符1.5 开启滚轮缩放 2 进阶设置2.1 选项卡不自我覆盖2.2 选项卡限制宽度2.3 选项卡组限制高度2.4 字体设置2.5 字体加粗2.6 侧边栏2.7 沉浸式代码模式 Zen Mode2.8 设置 Zen 模式的选项卡组 3…

filebeat接入nginx和mysql获取日志

下载nginx &#xff08;1&#xff09; 直接下载 yum install nginx -y&#xff08;2&#xff09;查看状态启动 systemctl start nginx systemctl status nginx&#xff08;3&#xff09;配置文件检查 nginx -t&#xff08;4&#xff09;端口检查 netstat -tulpn | grep :80&am…

Flutter项目打包ios, Xcode 发布报错 Module‘flutter barcode_scanner‘not found

报错图片 背景 flutter 开发的 apple app 需要发布新版本&#xff0c;但是最后一哆嗦碰到个报错&#xff0c;这个小问题卡住了我一天&#xff0c;之间的埪就不说了&#xff0c;直接说我是怎么解决的&#xff0c;满满干货 思路 这个报错 涉及到 flutter_barcode_scanner; 所…

携手并进,智驭教育!和鲸科技与智谱 AI 签署“101 数智领航计划”战略合作协议

近日&#xff0c;上海和今信息科技有限公司&#xff08;以下简称“和鲸科技”&#xff09;与北京智谱华章科技有限公司&#xff08;以下简称“智谱 AI”&#xff09;签署“101 数智领航计划”战略合作协议。双方将携手营造智能化学科教育与科研环境&#xff0c;提供多种大模型工…

前后端联调需要改ip联调多个后端,用nginx代理

前后端联调需要改ip联调多个后端 Nginx #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {include mime…

空洞卷积:Atrous/Dilated convolution - 语义分割中多用到

没办法&#xff0c;我还是很多基础的、底层的模块不通透&#xff0c;读论文难免会受到阻碍&#xff0c;而且这现在科研任务很急了&#xff0c;必须要马上动手实验&#xff0c;全给我弄明白、特别是算法&#xff01; 空洞卷积-可变形卷积-这一个个我都要。 空洞卷积据说在语义分…

C#WPF基本概念

一、什么是WPF&#xff1f; C# WPF&#xff0c;即Windows Presentation Foundation&#xff0c;是一个用于构建Windows桌面应用程序的UI框架。WPF支持广泛的应用程序开发功能&#xff0c;包括应用模型、资源、控件、图形、布局、数据绑定、文档和安全性。它是.NET Framework的…

MySQL企业常见架构与调优经验分享

文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记&#xff0c;分享于此~ 课程&#xff1a;MySQL企业常见架构与调优经验分享 mysql官方优化文档 一、选择 PerconaServer、…

TypeScript基础总结

一、TS 基础类型 &#xff08;1&#xff09;JavaScript 中的数据类型: string 字符串 number 数值 boolean 布尔 null 空 undefined 未定义 bigint 整数数据类型 symbol symbol 原…