Java8实战-总结7

news2024/11/25 9:31:38

Java8实战-总结7

  • 通过行为参数化传递代码
    • 真实的例子
      • 用Runnable执行代码块
      • GUI事件处理
    • 小结
  • Lambda表达式
    • Lambda管中窥豹

通过行为参数化传递代码

真实的例子

用Runnable执行代码块

线程就像是轻量级的进程:它们自己执行一个代码块。但是,怎么才能告诉线程要执行哪块代码呢?多个线程可能会运行不同的代码。需要一种方式来代表稍候执行的一段代码。在Java里,可以使用Runnable接口表示一个要执行的代码块。请注意,代码不会返回任何结果(即void):

	// java.lang.Runnable
	public interface Runnable {
		public void run();
	}

可以像下面这样,使用这个接口创建执行不同行为的线程:

	Thread t = new Thread(new Runnable() {
		public void run() {
			System.out.println("Hello world");
		}
	});

Lambda表达式的话,看起来是这样:

	Thread t = new Thread(() -> System.out.println("Hello world"));

GUI事件处理

GUI编程的一个典型模式就是执行一个操作来响应特定事件,如鼠标单击或在文字上悬停。
例如,如果用户单击“发送”按钮,之后显示一个弹出式窗口,或把行为记录在一个文件中。还是需要一种方法来应对变化;需要能够作出任意形式的响应。在JavaFX中,可以使用EventHandler,把它传给setOnAction来表示对事件的响应:

	Button button = new Button("Send");
	button.setOnAction(new EventHandlercActionEvent>() {
		public void handle(ActionEvent event) {
			label.setText("Sent!!");
	});

这里,setOnAction方法的行为就用EventHandler参数化了。用Lambda表达式的话,看起来就是这样:

	button.setOnAction((ActionEvent event) -> label.setText("Sent!!"));

小结

以下是本章中的关键概念。

  • 行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们,完成不同行为的能力。
  • 行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。
  • 传递代码,就是将新行为作为参数传递给方法。但在Java 8之前这实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在Java 8之前可以用匿名类来减少。
  • Java API包含很多可以用不同行为进行参数化的方法,包括排序、线程和GUI处理。

Lambda表达式

利用行为参数化来传递代码有助于应对不断变化的需求。它允许你定义一个代码块来表示一个行为,然后传递它。你可以决定在某一事件发生时(例如单击一个按钮)或在算法中的某个特定时刻(例如筛选算法中类似于“重量超过150克的苹果”的谓词,或排序中的自定义比较操作)运行该代码块。一般来说,利用这个概念,就可以编写更为灵活且可重复使用的代码了。

但使用匿名类来表示不同的行为并不令人满意:代码十分啰嗦,这会影响程序员在实践中使用行为参数化的积极性。Java 8中提供了解决这个问题的新工具——Lambda表达式。它可以让你很简洁地表示一个行为或传递代码。现在可以把Lambda表达式看作匿名功能,它基本上就是没有声明名称的方法,但和匿名类一样,它也可以作为参数传递给一个方法。

如何构建Lambda,它的使用场合,以及如何利用它使代码更简洁。还有一些新的东西,如类型推断和Java 8 API中重要的新接口。最后,将介绍方法引用(method reference),这是一个常常和Lambda表达式联用的有用的新功能。

Lambda管中窥豹

可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。

  • 匿名——匿名,是因为它不像普通的方法那样有一个明确的名称:写得少而想得多!
  • 函数——说它是函数,是因为Lambda函数不像方法那样属于某个特定的类。但和方法一样,Lambda有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。
  • 传递——Lambda表达式可以作为参数传递给方法或存储在变量中。
  • 简洁——无需像匿名类那样写很多模板代码。

Lambda这个词来自于学术界开发出来的一套用来描述计算的λ演算法。在Java中传递代码十分繁琐和冗长。Lambda解决了这个问题:它可以让你十分简明地传递代码。理论上来说,在Java 8之前做不了的事情,Lambda也做不了。但是,现在用不着再用匿名类写一堆笨重的代码,来体验行为参数化的好处了!Lambda表达式鼓励采用行为参数化风格。最终结果就是你的代码变得更清晰、更灵活。比如,利用Lambda表达式,可以更为简洁地自定义一个Comparator对象。

先前:

Comparator<Apple> byWeight = new Comparator<Apple>() {
	public int compare(Apple a1, Apple a2) {
		return a1.getWeight().compareTo(a2.getWeight());
	}
};

之后(用了Lambda表达式):

Comparator<Apple> byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

代码看起来更清晰了。现在,请注意,基本上只传递了比较两个苹果重量所真正需要的代码。看起来就像是只传递了compare方法的主体。甚至还可以进一步简化代码。

刚刚展示的Lambda表达式有三个部分,如下图所示:
在这里插入图片描述

  • 参数列表——这里它采用了Comparatorcompare方法的参数,两个Apple
  • 箭头——箭头 -> 把参数列表与Lambda主体分隔开。
  • Lambda主体——比较两个Apple的重量。表达式就是Lambda的返回值了。

为了进一步说明,下面给出了Java 8中五个有效的Lambda表达式的例子。

//第一个Lambda表达式具有一个string类型的参数并返回一个int。Lambda没有return语句,因为已经隐含了return
(String s) -> s.length()
//第二个Lambda表达式有一个Apple类型的参数并返回一个boolean(苹果的重量是否超过150克)
(Apple a) -> a.getWeight() > 150
//第三个Lambda表达式具有两个int类型的参一数而没有返回值(void返回)。注意Lambda表达式可以包含多行语句,这里是两行
(int x, int y) -> {
	System.out.println("Result:");
	System.out.println(x + y);
}
//第四个Lambda表达式没有参数,返回一个int
() -> 42
//第五个Lambda表达式具有两个apple类型的参数,返回一个int:比较两个Apple的重量
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight ())

Java语言设计者选择这样的语法,是因为C#Scala等语言中的类似功能广受欢迎。Lambda的基本语法是

(parameters) -> expression

或(请注意语句的花括号)

(parameters) -> { statements;}

可以看到,Lambda表达式的语法很简单。

Lambda语法测验
根据上述语法规则,以下哪个不是有效的Lambda表达式?
(1)() -> {}
(2)() -> "Raoul"
(3)() -> {return "Mario";}
(4)(Integer i) -> return "Alan"+ i;
(5)(String s) -> {"IronMan";}
答案:只有45是无效的Lambda(1)这个Lambda没有参数,并返回void。它类似于主体为空的方法:public void run() {}(2)这个Lambda没有参数,并返回String作为表达式。
(3)这个Lambda没有参数,并返回String(利用显式返回语句)(4) return是一个控制流语句。要使此Lambda有效,需要使花括号,如下所示:(Integer i) -> {return "Alan"+ i;}(5)IronMan”是一个表达式,不是一个语句。要使此Lambda有效,你可以去除花括号和分号,如下所示:(String s) -> "IronMan"。或者使用显式返回语句,如下所示:(String s) -> {return "IronMan";}

一些Lambda的例子和使用案例:
在这里插入图片描述

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

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

相关文章

QT实现连接MySQL数据库以及查询等操作

QT实现连接数据库以及查询等操作 目录 QT实现连接数据库以及查询等操作实现效果建立数据库代码实现文件结构连接数据库增删改查 所用类及其函数解释源代码后面的话 实现效果 功能包含数据库的增删改查和界面的显示&#xff0c;因为没有用.ui文件所以控件的位置都是手动设置的&a…

【AI应用如何决策?如何研发出安全可信的AI应用?《Python可解释AI(XAI)实战》告诉你】

怎样才能有效地向A业务和利益相关者解释Al的决策?你需要仔细规划、设计和可视化。要解决的问题、模型以及变量之间的关系通常是微妙、出乎意料和复杂的。 《Python可解释AI&#xff08;XAI&#xff09;实战》通过几个精心设计的项目让你在实践中掌握众多XAI工具和方法&#x…

无涯教程-jQuery - triggerHandler( event, data )方法函数

triggerHandler(event&#xff0c;[data])方法触发元素(用于特定事件类型)上所有绑定的事件处理程序&#xff0c;而无需执行浏览器的默认操作&#xff0c;冒泡或实时事件。 triggerHandler( event, [data] ) - 语法 selector.triggerHandler( event, [data] ) 这是此方法使用…

【Matlab】基于粒子群优化算法优化BP神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于粒子群优化算法优化 BP 神经网络的数据回归预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码5.1 fun.m5.2 main.m 6.完整代码6.1 fun.m6.2 main.m 7.运行结果 1.模型原理 基于粒子群优化算法&#xff08;…

2、基于redis实现分布式锁

目录 2.1. 基本实现2.2. 防死锁2.3. 防误删2.4. redis中的lua脚本2.4.1 redis 并不能保证2.4.2 lua介绍 2.5. 使用lua保证删除原子性 2.1. 基本实现 借助于redis中的命令setnx(key, value)&#xff0c;key不存在就新增&#xff0c;存在就什么都不做。同时有多个客户端发送setn…

PhonewindowManager 使用详解

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Android 按键修改二、PhoneWindowManager 简介三、如何打开 或者 关闭 Navigation Bar四、如何长按Home 键启动Google Now五、如何长按实体Menu键进…

B. Vika and the Bridge

Example input 5 5 2 1 1 2 1 1 7 3 1 2 3 3 3 2 1 6 6 1 2 3 4 5 6 8 4 1 2 3 4 2 3 1 4 3 1 1 1 1 output 0 1 2 2 0 解析&#xff1a; 题意为每次只能踩相同颜色的木板&#xff0c;同时他有一次改变一块木板颜色的机会&#xff0c;问每种颜色的最大跨的步子长度中的最小…

Linux复习——基础知识

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 1. 有关早期linux系统中 sysvin的init的7个级别描述正确的是( )[选择1项] A. init 1 关机状态 B. init 2 字符界面多用户模式 …

科技云报道:大模型的火烧到了AI服务器上

科技云报道原创。 大模型的纷争已经随着各大入局者公布产品后&#xff0c;热度逐渐退去&#xff0c;但是由大模型带来的产业链高频共振&#xff0c;已经传递了算力层。 表现最为激烈的&#xff0c;就是AI服务器市场。大模型带来的算力需求&#xff0c;直接引发了一波AI服务器…

算法(4)

字符串 给定一个数值的数组&#xff0c;要求组合最小的数值。 public String PrintMinNumber(Integer [] s) {if(snull) return null;String s1"";ArrayList<Integer> listnew ArrayList<Integer>(Arrays.asList(s)); // for(int i0;i<s.leng…

二维数组练习题-回形数

从键盘输入一个整数&#xff08;1~20&#xff09;&#xff0c;则以该数字为矩阵&#xff0c;将数字按照顺时针螺旋填入其中 package array;import java.util.Scanner;/*** author 苗晓强* date 2023/7/26 23:56* 回形数&#xff1a;* 从键盘输入一个整数&#xff08;1~20&…

从9G到0.3G,腾讯会议对他们的git库做了什么?

&#x1f449;导读 过去三年在线会议需求井喷&#xff0c;腾讯会议用户量骤增到3亿。快速迭代的背后&#xff0c;腾讯会议团队发现&#xff1a;业务保留了长达5年的历史数据&#xff0c;大量未进行 lfs 转换&#xff0c;新 clone 仓库本地空间占17.7G。本地磁盘面临严重告急&am…

FastSAM 论文解读

论文名称&#xff1a;Fast Segment Anything 论文地址&#xff1a;http://export.arxiv.org/pdf/2306.12156 代码地址&#xff1a;GitHub - CASIA-IVA-Lab/FastSAM: Fast Segment Anything 1. 关键内容 基于YOLOv8-seg实现了FastSAM&#xff0c;它比SAM快50倍&#xff0c;且…

数仓学习---15、数据仓库工作流调度

1、数据仓库工作流调度 1.1 调度工具部署 工具部署链接 1.2 新数据生成 1.2.1 用户行为日志 1、启动日志采集通道&#xff0c;包括Kafka、Flume等 &#xff08;1&#xff09;启动Zookeeper zk.sh start&#xff08;2&#xff09;启动Kafka kf.sh start&#xff08;3&…

【雕爷学编程】Arduino动手做(95)---GY9960手势传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

电容触摸屏(TP)的工艺结构

液晶显示屏(LCM),触摸屏(TP) “GG、GP、GF”这是结构分类&#xff0c;第一个字母表面材质&#xff08;又称为上层&#xff09;&#xff0c;第二个字母是触摸屏的材质&#xff08;又称为下层&#xff09;&#xff0c;两者贴合在一起。 G玻璃&#xff0c;FFILM&#xff0c;“”贴…

华为eNSP:路由引入

一、拓扑图 二、路由器的配置 1、配置路由器的IP AR1&#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2&#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huaw…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 一)

状态管理概述 在前文的描述中&#xff0c;我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 图1 效果图 上面的示例中&#xff0c;用户与应用程序的交互触发了文本状态变更&#xff0c;状态变更引起了UI渲染&#x…

Blazor实战——Known框架多表增删改查

多表增删改查示例 本章介绍学习多张表增、删、改、查功能如何实现&#xff0c;下面以销货出库单作为示例&#xff0c;该业务栏位如下&#xff1a; 销货出库单栏位 销货单号、销货日期、状态、客户、备注 销货出库单明细栏位 商品编码、商品名称、规格型号、数量、单位、单价、…

详解rocketMq通信模块升级构想

本文从开发者的角度深入解析了基于netty的通信模块, 并通过简易扩展实现微服务化通信工具雏形, 适合于想要了解netty通信框架的使用案例, 想了解中间件通信模块设计, 以及微服务通信底层架构的同学。希望此文能给大家带来通信模块架构灵感。 概述 网络通信是很常见的需求&#…