Java 核心技术卷 I 学习记录八

Java 核心技术卷 I 学习记录八

  • 六、接口、lambda表达式与内部类
    • 3、lambada表达式
      • 1、为什么引入lambda表达式
      • 2、lambda表达式的语法
      • 3、函数式接口
      • 4、方法引用
      • 5、构造器引用
      • 6、变量作用域
      • 7、处理lambda表达式
      • 8、再谈Comparator

六、接口、lambda表达式与内部类

3、lambada表达式

使用 lambda 表达式采用一种简洁的语法定义代码块。

1、为什么引入lambda表达式

lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。

2、lambda表达式的语法

// 检查一个字符串是否比另一个字符串短
first.length() -second.length();// Java是一种强类型语言,指定变量类型
(String first, String second) -> first.length() -second.length();

lambda表达式就是一个代码块,以及必须传入代码的变量规范。
Java中的一种lambda表达式形式:参数,箭头(->)以及一个表达式。如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,把这些代码放在 {} 中,并包含显式的return语句。

// lambda例子:检查一个字符串是否比另一个字符串短
(String first, String second) -> {if (first.length() < second.length()) return -1;else if (first.length() > second.lenght()) return 1;else return 0;
}

即使lambda表达式没有参数,仍然要提供空括号,就像无参数方法一样:

() -> { for (int i=100;i>=0;i-- ) System.out.println(i); 
}

如果可以推导出一个lambda表达式的参数类型,就可以忽略类型:

Comparator<String> comp= (first, second) // Same as (String first, String second) -> first.length() - second.length();

在这里,编译器可以推导出first和second必然是字符串,因为这个lambda表达式将赋给一个字符串比较器。
如果方法只有一个参数,而且这个参数的类型可以推导出来,甚至还可以省略小括号:

ActionListener listener = event ->System.out.println("The time is " + new Date()); // Instead of (event) -> . . . or (ActionEvent event) -> . . .

无需指定lambda表达式的返回类型。lambda表达式的返回类型会根据上下文推导出。

3、函数式接口

对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口(functional interface)。
在Java中,对lambda表达式所能做的也只是能转换为函数式接口。在其他支持函数字面量的程序设计语言中,可以声明函数类型(如(String, String) -> int)、声明这些类型的变量,还可以使用变量保存函数表达式。不过,Java设计者还是决定保持我们熟悉的接口概念,没有为Java语言增加函数类型。

4、方法引用

如果已经有现成的方法已经可以完成你想要传递到其他代码的某个动作。

// 假如希望只要出现一个定时器事件就打印这个事件对象
Timer t = new Timer(1000, event -> System.out.println(event));// 如果直接把println方法传递到Timer构造器
Timer t = new Timer(1000, System.out::println);

表达式System.out::println是一个方法引用(method reference),它等价于lambda表达式x -> System.out.println(x);。
要用::操作符分隔方法名与对象或类名。主要有3种情况:

  • object::instanceMethod
  • Class::staticMethod
  • Class::instanceMethod

在前2种情况中,方法引用等价于提供方法参数的lambda表达式。对于第3种情况,第1个参数会成为方法的目标。
可以在方法引用中使用this参数。例如,this::equals等同于x -> this.equals(x)。使用super也是合法的。super::instanceMethod,使用this作为目标,会调用给定方法的超类版本。

5、构造器引用

构造器引用与方法引用很类似,只不过方法名为new。例如,Person::new是Person构造器的一个引用。具体引用哪一个构造器取决于上下文。
可以用数组类型建立构造器引用。例如,int[]::new是一个构造器引用,它有一个参数:即数组的长度。这等价于lambda表达式 x -> new int[x]。
Java有一个限制,无法构造泛型类型T的数组。数组构造器引用对于克服这个限制很有用。表达式new T[n]会产生错误,因为这会改为new Object[n]。对于开发类库的人来说,这是一个问题。

6、变量作用域

可能希望能够在lambda表达式中访问外围方法或类中的变量。
lambda表达式有3个部分:

  • 1、一个代码块;
  • 2、参数;
  • 3、自由变量的值,这是指非参数而且不在代码中定义的变量。

关于代码块以及自由变量值有一个术语:闭包(closure)。如果有人吹嘘他们的语言有闭包,现在你也可以自信地说Java也有闭包。在Java中,lambda表达式就是闭包。

7、处理lambda表达式

使用lambda表达式的重点是延迟执行(deferred execution)毕竟,如果想耍立即执行代码,完全可以直接执行,而无需把它包装在一个lambda表达式中。之所以希望以后再执行代码,这有很多原因,如:

  • 在一个单独的线程中运行代码;
  • 多次运行代码;
  • 在算法的适当位置运行代码(例如,排序中的比较操作);
  • 发生某种情况时执行代码(如,点击了一个按钮,数据到达,等等);
  • 只在必要时才运行代码。

Java API中提供的最重要的函数式接口。

函数式接口参数类型返回类型抽象方法名描述其他方法
Runnablevoidrun作为无参数或返回值的动作运行
SupplierTget提供一个T类型的值
ConsumerTvoidaccept处理一个T类型的值addThen
BiConsumer<T, U>T, Uvoidaccept处理T和U类型的值addThen
Function<T, R>TRapply有一个T类型参数的函数compose, addThen, indetify
BiFunction<T, U, R>T, URapply有T和U类型参数的函数addThen
UnaryOperatorTTapply类型T上的一元操作符compose, addThen, identify
BinaryOperatorT, TTapply类型T上的二元操作符andThen, maxBy, minBy
PredicateTbooleantest布尔值函数and, or, negate, isEqual
BiPredicate<T, U>T, Ubooleantest有两个参数的布尔值函数and, or, negate

基本类型int、long和double的34个可能的规范。最好使用这些特殊化规范来减少自动装箱。

函数式接口参数类型返回类型抽象方法名
BooleanSuppliernonebooleangetAsBoolean
PSuppliernonepgetAsP
PConsumerpvoidaccept
ObjPConsumerT, pvoidaccept
PFunctionpTapply
PToQFunctionpqapplyAsQ
ToPFunctionTpapplyAsP
ToPBiFunction<T, U>T, UpapplyAsP
PUnaryOperatorppapplyAsP
PBinaryOperatorp, ppapplyAsP
PPredicatepbooleantest

8、再谈Comparator

Comparator接口包含很多方便的静态方法来创建比较器。这些方法可以用于lambda表达式或方法引用。
静态comparing方法取一个“键提取器”函数,它将类型T映射为一个可比较的类型(如 String)。对要比较的对象应用这个函数,然后对返回的键完成比较。

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

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

相关文章

vscode 快捷键生成代码

1. &#xff01;Tab/回车键 便捷生成html初始结构代码&#xff08;注意&#xff01;是英文字符&#xff09; 2. Alt B 快捷默认浏览器打开 3. Ctrl / 增加注释 4. 光标放到该行即可&#xff0c;直接ctrlC&#xff0c;ctrlv&#xff0c;即可在下面复制一行 5. 选中要修改的标签…

前端接入Paymax支付请求

材料指南 开发者平台 &#xff1a;配置开发必备信息&#xff08;appid&#xff0c;商户号&#xff0c;公钥私钥&#xff09;,此处与请求参数appId、merchantNo有关。 PayerMax Apis&#xff1a;各支付接口信息,本文以收银台支付API为请求展开,请求url为orderAndPay,测试环境基…

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

CSS遮罩:mask

CSS属性 mask 允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。 // 一般用位图图片做遮罩 mask: url(~/assets/images/mask.png); mask-size: 100% 100%;// 使用 SVG 图形中的形状来做遮罩 mask: url(~/assets/images/mask.svg#star);…

Zmap+python脚本+burp实现自动化Fuzzing测试

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…

15. Python中的os.path模块/路径操作相关

这个专栏记录我学习/科研过程中遇到的一些小问题以及解决方案&#xff0c;一些问题可能比较蠢请见谅。自用&#xff0c;仅供参考。 ------------------------------------------------------------------------------------ Python中的os.path模块详解&#xff08;包括一些常…

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战&#xff0c;学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目&#xff0c;编写首页代码&#xff0c;实现按钮跳转至第二个页面并…

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐

论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息&#xff1a; 简介: 本文讨论的背景是大型语言模型&#xff08;LLMs&#xff09;的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…

Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪

这里写目录标题 1.目标检测 Detection2.实例分割 segment3.图像分类 classify4.关键点估计 Keypoint detection5.视频帧检测 video detect6.视频帧分类 video classify7.旋转目标检测 obb detect8.替换yolo11模型 给我点个赞吧&#xff0c;谢谢了附录coco80类名称 笔记本 华为m…

图像处理学习笔记-20241118

文章目录 霍夫变换基本原理霍夫变换的步骤使用 OpenCV 实现直线检测示例&#xff1a;标准霍夫变换 示例&#xff1a;概率霍夫变换参数解释霍夫变换检测圆 基于GAN的样本生成GAN的基本原理基于GAN的数据增广流程实现代码示例 同态滤波&#xff08;Homomorphic Filtering&#xf…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

当科技照进现实 机器人带着机器狗乘空轨

湖北日报讯&#xff08;记者魏铼、通讯员张璨龙&#xff09;11月14日&#xff0c;武汉东湖高新区空轨高新大道站&#xff0c;在光谷装上“智慧大脑”的人形机器人&#xff0c;乘空轨&#xff0c;看AI展&#xff0c;与小朋友在生态大走廊斗舞。 京天博特&#xff1a;光谷“智慧大…

freertos任务调度学习

首先创建任务&#xff0c;创建好任务后&#xff0c;开启任务调度器&#xff0c;任务才能执行 1.开启任务调度器 2.启动第一个任务 3.任务切换

蓝桥杯每日真题 - 第16天

题目&#xff1a;&#xff08;卡牌&#xff09; 题目描述&#xff08;13届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目分析&#xff1a; 有 n 种卡牌&#xff0c;每种卡牌的现有数量为 a[i]&#xff0c;所需的最大数量为 b[i]&#xff0c;还有 m 张空白卡牌。 每…

MySQL系列之数据授权(privilege)

导览 前言Q&#xff1a;如何对MySQL数据库进行授权管理一、MySQL的“特权”1. 权限级别2. 权限清单 二、授权操作1. 查看权限2. 分配权限3. 回收权限 结语精彩回放 前言 看过博主上一篇的盆友&#xff0c;可以Get到一个知识点&#xff1a;数据授权&#xff08;eg&#xff1a;g…

C++为函数提供的型特性——缺省参数与函数重载

目录 一、缺省参数 二、函数重载 一、缺省参数 C为函数提供了一项新的特性——缺省参数。缺省参数指的是当前函数调用中省略了实参自动使用的一个值。这极大地提高了函数的灵活性 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值 。在调⽤该函数时&#xff0c;如果没有…

android 使用MediaPlayer实现音乐播放--权限请求

在Android应用中&#xff0c;获取本地音乐文件的权限是实现音乐扫描功能的关键步骤之一。随着Android版本的不断更新&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用需要动态请求权限&#xff0c;而到了android 13以上需要的权限又做了进一步…

go-zero(一) 介绍和使用

go-zero 介绍和使用 一、什么是 go-zero&#xff1f; go-zero 是一个基于 Go 语言的微服务框架&#xff0c;提供了高效、简单并易于扩展的 API 设计和开发模式。它主要目的是为开发者提供一种简单的方式来构建和管理云原生应用。 1.go-zero 的核心特性 高性能&#xff1a; g…

Orcad 输出有链接属性的PDF

安装adobe pdf安装Ghostscript修改C:\Cadence\SPB_16.6\tools\capture\tclscripts\capUtils\capPdfUtil.tcl ​ 设置默认打印机为 Adobe PDF ​ 将Ghostscript的路径修改正确 打开cadence Orcad &#xff0c;accessories->candece Tcl/Tk Utilities-> Utilities->PD…

.NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】

一、使用VSCode开发.NET项目 1、创建文件夹&#xff0c;使用VSCode打开 2、安装扩展工具 1>C# 2>安装NuGet包管理工具&#xff0c;外部dll包依靠它来加载 法1》&#xff1a;NuGet Gallery&#xff0c;注意要启动科学的工具 法2》NuGet Package Manager GUl&#xff0c…