【AICon】AI 大模型超全落地场景&最佳实践 了解详情
写点什么

Java 中的 SAMbdas

  • 2010-07-29
  • 本文字数:1680 字

    阅读完需:约 6 分钟

8 月 16 - 19 日,与零一万物李开复、蔚来李斌、面壁智能李大海,及工商银行、交通银行、华夏银行等 100+ 行业专家相聚 FCon x AICon

自从最初的Lambda 提案(以及 InfoQ 的深度分析)发布后, Lambda 的状态就发生了翻天覆地的变化:Lambda 被纳入到了 JDK 7 当中。感兴趣的读者可以继续阅读,看看有哪些新东西。

最初的 Lambda 语法饱受诟病,但实际上,问题的严重性远不止纯粹的语法那么简单(毕竟,语法只不过是个外表而已)。其中一个主要的问题是 Java 并没有对函数类型提供直接的支持,这给 Java 类型系统带来了一些问题(函数数组可能引起异常泄漏)。无论能否克服这些问题(或者说在给定的 JDK 7 延期发布的时间内),Lambda 都不会再涉及函数类型了。

我们可以采用适配的方式简化内部类的编写过程。这些类叫做 SAM(即 Single Abstract Method)类。它代表了 Java 语言中抽象类与接口的一个重要子集,仅包含一个抽象方法。比如说,Runnable 接口的 run() 方法、Comparator 接口的 compare() 方法等(只包含一个抽象方法的抽象类也是可以的,比如 Eclipse 的 org.eclipse.core.runtime.jobs.Job )。

目前进行中的规范表明下面两种表达方式是等价的:

复制代码
Collections.sort(list,new Comparator() {
public int compare(Object o1, Object o2) {
return(o1.toString().length() - o2.toString().length());
}
}
// is the same as
Collections.sort(list,
{ Object o1, Object o2 -> o1.toString().length() - o2.toString().length() }
);

不得不说的是,Lambda 语法依然处于提案阶段,未来可能会发生变化,但基本想法是在 Lambda 项目的帮助下,我们可以更加简洁的方式编写内部类,从而抛弃现在所用的匿名类方式。另外,Lambda 会保持与内部类一样的表现力,可以从局部堆中获取状态(但堆是否要保持可变的状态依然是人们争论的热门话题)。然而,语言本身的一些变化(比如说可以高效获取 final 变量)以及类型与方法 / 异常推断的能力使得 Lambda 要比相应的匿名类更加简洁。

之所以采取这种方式,一个原因就是可以不必修改现有的类(主要是 java.util 包中的集合类)。假如使用了函数类型方式,那么就必须得修改集合类以适应 Lambda,或者是在 JDK 7 中放弃对 Lambda 的支持。其他程序库可能比较灵活,但整个 Java 类库并非这么容易修改,这也解释了为什么要采取其他方式。

还可以使用方法引用来代替 SAMbda。如下代码所示:

复制代码
public class Comparisons {
public static int compareLength(Object o1, Object o2) {
return(o1.toString().length() - o2.toString().length());
}
public static int compareHash(Object o1, Object o2) {
return(o1.hashCode() - o2.hashCode());
}
}
// examples
Collections.sort(list,#Comparisons.compareLength);
Collections.sort(list,#Comparisons.compareHash);

#代表方法句柄,类似于 java.lang.reflect.Method。然而,与 Method 不同的是,他们是在编译期(而非运行期)确定的,JVM 的 JIT 可以自动内联方法引用。这么做还具有其他优化效果,比如说针对给定的 SAM 类型,可以单独创建一个类表示代理的方法句柄而不必在使用时创建新的匿名类。

最后,还是存在一些有争议的问题。目前规范的最初草案禁止使用 break 和 continue,但后来澄清说这么做的目的是为了防止跳出 SAMBda 而进入到封闭的范围内。另外一个主要的变化是 return 变成隐式的了,不允许在 Lambda 内部使用;但替代的关键字 yield(不要与 Thread.yield() 混为一谈)与内部类中的 return 具有相同的语义。表面上来看,这么做可以实现在方法调用后,使用 Lambda 触发方法中的 return 的效果(即所谓的“long return”)。未来在语法上也会有一些变化,可以在 Lambda 中使用 return,这需要使用新的关键字(或是关键字组合,比如 long return)。其他相似之处还有使用 this 引用封闭的 SAM 实例,使用 Outer.this 引用封闭类的实例。

虽说使用 Lambda 替换 SAM 这个决定不如项目最初的提案那样雄心勃勃,但还是有不少优势的:实现简单、无需修改现有的集合类、能够很快派上用场(不管使用何种方式,只要增加函数类型就需要修改集合类)。未来,还可以使用相同的 Lambda 语法创建函数引用,但其目标是今后发布的 JDK 版本。

查看英文原文: SAMbdas in Java

2010-07-29 04:531501
用户头像

发布了 88 篇内容, 共 260.3 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

专业视频调色软件达芬奇DaVinci Resolve Studio 18激活中文正式版

胖墩儿不胖y

Mac软件 视频剪辑工具 视频后期处理工具 Mac软件视频编辑

搭建本地http服务器-打开本地文件

Lemoon Can

notion链接脑图 mac开机自启动服务 打开本地文件的http服务器

DaVinci Resolve Studio 18:视频编辑和调色的新标准

iMac小白

应用现代化加速企业数字化转型

这我可不懂

人工智能 大数据 云原生 数字化

URL Manager Pro for Mac(浏览器标签管理应用)v6.4.1激活版

iMac小白

低代码正在改变软件开发方式

互联网工科生

软件开发 低代码 JNPF

文心一言 VS 讯飞星火 VS chatgpt (151)-- 算法导论12.2 7题

福大大架构师每日一题

福大大架构师每日一题

Macs Fan Control Pro for mac( 电脑风扇控制软件)v1.5.16中文激活版

iMac小白

【EMNLP 2023】面向垂直领域的知识预训练语言模型

阿里云大数据AI技术

未雨绸缪,天翼云云备份护航企业稳健发展

Geek_2d6073

从 MLOps 到 LMOps 的关键技术嬗变

百度Geek说

大模型 MLOps 12 月 PK 榜 Prompt LMops

生产环境质量保障的四大挑战

老张

质量保障 测试右移

Solidity之旅(七)单位以及全局变量

BSN研习社

专业统计分析绘图软件:GraphPad Prism 10 激活最新版

mac大玩家j

数据分析工具 Mac软件 数学分析软件

Dropzone 4 for mac(文件拖拽增强工具)v4.80.4激活版

iMac小白

使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载

字节跳动云原生计算

ray KubeRay

在使用item_get API时,如何处理重复的商品信息?

技术冰糖葫芦

API 接口

MySQL数据库中SQL语句分几类?

小魏写代码

做服务的架构陷阱,你掌握了多少

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟

去哪儿如何实现故障率降低65%?技术+管理的数字化度量体系实践

TakinTalks稳定性社区

人工智能的基础概念与原理

测吧(北京)科技有限公司

测试

人工智能 | 计算机如何理解和生成人类语言

测吧(北京)科技有限公司

测试

JetBrains PhpStorm 2023 for Mac(PHP集成开发)v2023.3中文激活版

iMac小白

如何最大化利用虚拟主机:实用技巧与建议

一只扑棱蛾子

虚拟主机

【腾讯云 HAI域探秘】整合腾讯云HAI的ChatGLM模型到NUXT官网:实现智能IM功能

攀登者

鹏华基金核心系统完成国产化升级,腾讯云大数据TBDS再拓应用新场景

腾讯云大数据

TBDS

亚马逊云科技宣布推出三项无服务器服务创新

财见

一文详解安全随机数

华为云开发者联盟

安全 华为云 华为云开发者联盟

人工智能 | 数据驱动的机器学习:智能系统如何学习

测吧(北京)科技有限公司

测试

Java中的SAMbdas_Java_Alex Blewitt_InfoQ精选文章