java-Lambda 语法总结

news2024/11/17 3:26:59

文章目录

  • Lambda 语法概览
  • Lambda 表达式语法
    • 1.Lambda 表达式与函数接口
    • 2.Lambda 遇上 this final

Lambda 语法概览

String(] names = {Justi n ”,”caterpillar”,Bush " }; 
Arrays . sort (names, new Compara tor<String> () { 
	publ int compare (String namel , String name2) { 
		retu rn namel . length () - name2 . length() ;
	}
});

Arrays ort ()方法可以用来 ,只不过,你得告诉它两个元 比较时顺序是什么, sort()
规定得操作 java.util Comparator 说明这件事,然而那个匿名类的语法有些冗长。先别急着
使用 Lambda 法, 如果想稍微改变一下 Arrays sort ()该行的可读性,在 JDK8 出现前,可以

Comparator<String> byLength =new Comparator<String>() { 
	public int compare(String namel , String name2) { 
		return namel . length() - name2 . length();
	}
});

String[] names = {Justin,”caterpillar”,Bush); 
Arrays . sort (names, byLength) ;

通过变量 byLength ,确实是可以让排序的意图清楚许多,只是操作 Comparator 时的匿名类
依旧冗长,有太多重复的信息,如果使用 JDK8 的话,可以使用 Lambda 特性去除重复的信息。
例如,声明 byLength 时已经写了一次 Comparator<String >,为什么操作匿名类时又得写一
Comparator<String ?使用 JDK8 Lambda 表达式的话,可以 为:

Comparator byLength =
(String namel , Str ng name2) -> namel . length() - name2 . length( );
重复 Comparator<String >信息从等号右边去除了,因为原 匿名类只有 个方法要操
作,因此在使用 Lambda 达式时,实际上从等号左边的 Corr rator<String >声 明就可以知道,
Lambda 表达式实际上是要操作 Comparator<Str 工口 compare ()方法。仔细看看,还有重复
信息,既然声明变量时使用了 Comparator<String >,为什么 Lambda 表达式的参数上又得声明一
String ?实际上确实不用,因为编译程序可 以从 byLength 变量的声明类型,推断 name1、name2 类型 ,因此可以再简化为:

Cornparator<String> byLength = (narnel , narne2) - > narnel. length() - narne2 . length() ;

直接放 Arrays sort ()方法中

package cc . openhorne ; 
import java . util . Arrays; 
public class LarnbdaDerno { 
	public stat VO rnain(String[] args) { 
		String[] names = {Justin,”caterpillar”,Bush); 
		Arrays . sort (names , (namel , name2) -> namel . length() - name2. length() ); 
		Systern . out .println(Arrays.toString(narnes)) ;
	}
}

Lambda 表达式语法

1.Lambda 表达式与函数接口

如果接口里只有一个抽象方法,那么就是函数式接口,可以使用注解(@FunctionalInterface)检测该接口是否是函数式接口,即只能有一个抽象方法。

Comparator<St ring> byLength = 
	(String namel , String name2) - > namel . length( ) - name2.length ();

拆开为两 分, 等号右 Lambda 表达 Expressio ,等号左 作为 Lambda
达式的目标类型 Target Type 。先来看看等号右边的 Lambda 表达式

(String namel , String ame2 - > namel . l e ngth() name2 . length()

Lambda 达式表示接受两 参数 namel name2 ,参数 String 类型,目前-〉右
义了 返回结果 式, 果运算 比较复杂,必须使 多行描述, 以加入门定
述区块,如果 返回值,必须加 return ,例如:

(String namel , String ame2) - > { 
	Stri ng namel = namel.trim() ; 
	String name2 = name2.trim() ; 
	return namel . length () - name2 . length ();
}

区块可 由数个描述语句组成 本上不 议如此使用。在 Lambda 表达式时
尽量使用简单的 ,如 操作比较复杂,可以 方法参考等其 方式。
Lambda 中,即 接受任何 数,也必须 下括号。 例如:

()-> Justi //不接受参数 返回字符串
() -> System.out.println () //不接受参数 没有返回值

只有Lambda 达式的情况下, 参数的类型必须写 ,如果有 目标类型的话,在编译程
序可推断 类型 况下, 就可 以不写出 Lambda 参数类型。 例如以下范例可以
Comparator<String 中推断出 namel name2 的类型, 实际 String ,因而就不用写 参数类型:

Comparator<Str ng> byLength = (namel , name2) -> namel. length() -name2.length () ;

Lambda 式本身是中性的, 表任 类型 ,同样 Lambda 表达式可用来
表示不 同目标类型 的对象操 。举例而 (name1,name2 ) -> namel1. length () - name2 . length ()
的范例中,用来表示 Comparator 的操作:

public interface Func<P,R>{
	R apply(P p1, P p2)();
}

同样是(namel , name2) -> namel. length() -name2.length () 这个 达式, 在以下的代码程序中:

Func<String,Integer> func = (name1,name2) -> name1.length() - name2.length();	

就是用来表示 目标类型 Func<String Integer 作, 个例 也示范 如何
Lambda 达式的 类型 Lambda 并没有导入新类型来作为 Lambda 达式的类型 ,而
就现 interface 语法来定义函数接口(Funeti onal Interface ),作为 Lambda 达式的目标
接口 就是接 口,但 求仅具单 抽象方 ,许 口都 这种接 ,如
API 中的 Runnable Callable Comparator ,都只 义了 方法。

public interface Runnable { 
	roid run(); 
}
public interface Callable<V> { 
	V call () throws Exception;
}
public interface Comparator<T> { 
	int compare(T ol , T o2) ;
}

在撰写 Lambda 表达式时,若编译程序可推断出类型,本来可以写为:
Fune func = (s) - > out.println(s) ;
这时括号 是多余 了,可 省略写为:
Fune func = s - > out . println(s) ;

函数接口是仅具单 象方法的接口,不过有时会难 直接分辨接 口是否为函数接口,稍
后就会看到,因为 JDK8 interface 语法做了改进,允许有默认方法 Default Method
而接口可能继承其他接口、 重新定义 某些方法等,这些都会使得确认接口是否为函数接口更为困难。有个新标注 @FunctionalInterface JDK8 被引入,它可以这么使用:

@Functional Interface 
public interface Func<P, R> { 
	R appl y (P p) ;
}

如果接口使用了@Funct inalinterfac 来标注,而本身并非函数接口的话,就会引发编译错
误。例如 以下这个接口:

@Fun ct onalinterface
public interface Function<P, R> { 
	R call (P p) ; 
	R call(P pl , P p2);
}

2.Lambda 遇上 this final

Lambda 式并不是匿名类的语法蜜糖,如果将它当作语法蜜糖 this 实际参考对
象时,就会觉得困惑。先来看 下接下来的程序 了匿名类,先想想看结果会如何显示?

package cc.openhome ; 
import static java . lang . System.out ; 
class Hello { 
	Runnable rl =new Runnable() { 
		public void run() {
			out.println (this) ; 
		}
	};

	Runnable r2 = new Runnable(){
		public void run() {
			out.println (toString());
		}
	};
	
	public String toString () { 
		return "Hello , world";
	}

	public class ThisDemo {
		public static void main(String[] args) {
			Hello hello = new Hello();
			hello.rl.run();
			hello.r2.run();
		}
}
	

}


你认为执行结果会显示“ Hello, World ”吗?看来并不是

在这里插入图片描述
在这里插入图片描述

如果 Lambda 表达式只是匿名类的语法蜜糖,那么结果也该是显示 cc.openhome. Hello$1@
15db9742 cc.openhome Hello$2@6d06d69c 之类的信息, 事实上,执行结果会是显示两次 Hello
world !” 就是说, Lambda 表达式中 this 的参考对象以及 toString ()(也就是 this. toString () )
接受者,是来自 ambda 周围环境 Context),也就是看 Lambda 表达式是在哪个名称范畴
(Scope),就能参考该范畴 内的名称, 变量或方法。
在上面的范例中,因为是 Hello 类包围了 Lambda 表达式, Lambda 达式可以参考类范畴
中的名称,范例中定义了 He llo toStr ng ()返回” ello world 字符串 ,因而执行时才会
显示两次 Hello, world !”

3.方法与构造函数参考
4.接口默认方法

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

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

相关文章

伪装目标检测模型论文阅读之:Zoom in and out

论文链接&#xff1a;https://arxiv.org/abs/2203.02688 代码;https://github.com/lartpang/zoomnet 1.摘要 最近提出的遮挡对象检测&#xff08;COD&#xff09;试图分割视觉上与其周围环境融合的对象&#xff0c;这在现实场景中是非常复杂和困难的。除了与它们的背景具有高…

布隆过滤器四种实现(Java,Guava,hutool,Redisson)

1.背景 为预防大量黑客故意发起非法的时间查询请求&#xff0c;造成缓存击穿&#xff0c;建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数&#xff08;哈希函数&#xff09;来记录与识别某个数据是否在一个集合中。如果数据不在集合中…

两个方法实现echarts散点图的高光圆点

一、效果图&#xff1a; 二、代码 方法一&#xff1a;通过series的itemStyle进行设置&#xff0c;type为scatter 在 ECharts 中&#xff0c;要在二维散点图上实现看似 3D 的高光圆点效果&#xff0c;可以通过自定义散点图的 itemStyle 属性来实现。虽然无法直接创建真正的 3D…

Flume 之自定义 Source

1、简介 Flume 自带 Source 有 Avro、Thrift、Netcat、Taildir、Kafka、Http等&#xff0c;有些场合比如我们指定访问接口获取数据当做 Flume 的 Source&#xff0c;像这种定制化的 Source 需要我们自己实现&#xff0c;下面我将介绍如何自定义实现 Source。 2、自定义实现 Fl…

Linux中放大字体

环境&#xff1a;VMware17Pro&#xff0c;Ubuntu22.04 在显示设置外观中只看到图标放大的调整&#xff0c;没看到字体大小设置 不按照常规设置&#xff0c;点开下面的辅助功能->大号文本&#xff08;没有设置具体字号的选项&#xff0c;但是可以放大&#xff09; 效果图如下…

五、带登录窗体的demo

做了一个简单的带登录窗体的demo&#xff0c;有用户名和密码不能为空的验证&#xff0c;原理是在main.cpp的主函数入口处&#xff1a; 1、将默认的MainWindow主窗体注释。 2、新建一个formlogin登录窗体&#xff0c;在主函数中先运行登录窗体。 3、在登录窗体中引用MainWind…

Monorepo-uniapp 构建分享

Monorepo uniapp 构建灵感&#xff1a;刚好要做一个项目&#xff0c;于是想到升级一下之前自己写的一个vue3tspiniauno的模版框架&#xff0c;其实那个框架也不错&#xff1b;只是感觉还差点东西&#xff0c;我已经用那个小框架写了两三个项目&#xff1b;轻巧实用。为什么选…

线性代数——行列式按行(列)展开

目录 一、余子式&#xff1a;将行列式某元素所在行和列的元素全去掉 剩余部分所构成的行列式&#xff0c;称为该元素的余子式 二、代数余子式 三、行列式等于它的任一行&#xff08;列&#xff09;的各元素与对应代数余子式乘积之和 四、行列式某行元素&#xff08;列&…

transbigdata 笔记: 官方文档示例3:车辆轨迹数据处理

1 读取数据 轨迹数据质量分析 这一部分和 transbigdata笔记&#xff1a;data_summary 轨迹数据质量/采样间隔分析-CSDN博客 的举例是一样的 import pandas as pd import geopandas as gpd import transbigdata as tbddata pd.read_csv(Downloads/TaxiData-Sample.csv, names…

一文解析 Copycat Dex与 Bitcat Dex的区别

Copycat Dex和 Bitcat Dex都带一个 Cat 并且都是衍生品协议&#xff0c;很多人都会误认为这两个是同一个项目&#xff0c;实际不然。它们是面向两个不同赛道、不同资产类型的衍生品项目。 Copycat Dex和 Bitcat Dex都是衍生品 DEX&#xff0c;它们最本质的区别主要在于&#xf…

FPGA时序分析与时序约束(四)——时序例外约束

目录 一、时序例外约束 1.1 为什么需要时序例外约束 1.2 时序例外约束分类 二、多周期约束 2.1 多周期约束语法 2.2 同频同相时钟的多周期约束 2.3 同频异相时钟的多周期约束 2.4 慢时钟域到快时钟域的多周期约束 2.5 快时钟域到慢时钟域的多周期约束 三、虚假路径约…

亚马逊店飞飞ERP系统,跟卖+铺货+物流发货模式综合一体的ERP系统

跨境电商亚马逊&#xff0c;目前为止电商行业比较靠前的电商平台&#xff01;那么有人做电商&#xff0c;就会有人出单&#xff0c;有人出单就会有中转仓需求&#xff0c;代打包&#xff0c;代贴单&#xff01;那么这一切都是有一套逻辑完善的ERP来完成&#xff01;前端通过授权…

人工智能培训靠谱吗

靠谱的&#xff0c;因为人工智能是未来的发展趋势&#xff0c;因此&#xff0c;人工智能工程师也将成为就业爆款。人工智能工程师负责创建和开发自动化系统、算法和机器学习模型&#xff0c;以实现自主决策和任务执行。由于人工智能在可穿戴设备、家庭自动化、智能城市和自动驾…

信息技术安全评估准则新版标准的变化

文章目录 前言一、GB/T 18336 标准在我国的应用情况&#xff08;一&#xff09;以GB/T 18336 标准制定的信息技术产品国家标准&#xff08;二&#xff09;GB/T 18336 标准提升了国家关键信息基础设施的整体网络安全保障水平 二、新版 GB/T 18336 标准的变化及应用展望三、标准支…

C#,入门教程(66)——枚举Enum的高等用法

前言&#xff1a;国内码农与国外优秀程序员的最大区别是&#xff0c;我们的专家、教授喜欢唾沫横飞地&#xff0c;夸夸其谈语言特性、框架、性能&#xff0c;唯一目的是带私货&#xff08;书籍或教程&#xff09;&#xff0c;很少能写出真有用的程序。差距在哪呢&#xff1f;基…

MFC CAsyncSocket类作为客户端示例

之前写过CAsyncSocket类使用的博客;进一步看一下; VS新建一个MFC 对话框工程; 添加一个类,从CAsyncSocket继承,起个自己的名字; 对话框添加几个编辑框,按钮,静态控件; 为自己的CxxxAsyncSocket类添加重写的虚函数,OnConnect、OnReceive、OnSend; 自己的CAsyncSoc…

Python数据结构——列表

目录 一、认识Python数据结构 二、列表概述 三、列表切片 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;常见形式 &#xff08;三&#xff09;特别说明 四、列表的基本操作 &#xff08;一&#xff09;创建列表 &#xff08;二&#xff09;列表元素增加…

宿舍管理系统的设计与实现:基于Spring Boot、Java、Vue.js和MySQL的完整解决方案

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

GMP模型学习笔记:概念、流程概述、设计机制及部分场景

前言 Go是并发而生的语言&#xff0c;其中则通过GMP模型来进行协程的分配与调度。本篇将记录自己学习GMP模型的笔记。 进程、线程、协程分配流程概述 计算机发展之初&#xff0c;是只有进程的。那时候是单进程时代&#xff0c;多个进程顺序执行&#xff0c;计算机也没有并发…

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么&#xff1f;Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接&#xff08;默认&#xff09;关…