生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

Java 中的 SAMbdas

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

    阅读完需:约 6 分钟

自从最初的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:531463
用户头像

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

关注

评论

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

数据库中 SQL Hint 是什么?

LakeShen

数据库 sql

ubuntu中使用iptables限制端口

百度搜索:蓝易云

Linux ubuntu 防火墙 iptables 云服务器

DJ Mix Pads 2 - Remix Version for Mac(独特DJ混音创作软件)v16.0.1激活版

影影绰绰一往直前

Linux系统:CentOS 7 CA证书服务器部署

百度搜索:蓝易云

Linux centos 运维 云服务器 ECS

PHP用CURL发送Content-type为application/json的POST请求方法

百度搜索:蓝易云

php Linux 运维 云服务器 curl

2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates, Di

福大大架构师每日一题

福大大架构师每日一题

深入解析汽车MCU的软件架构

攻城狮Wayne

汽车电子 汽车

Redis之bitmap类型解读

百度搜索:蓝易云

redis 云计算 Linux 运维 BitMap

CleanMyMac X v4.15.1 最新破解版下载 Macos系统 最佳清理工具

Rose

CleanMyMac X中文版 CleanMyMac X破解版 Mac系统清理 苹果电脑系统优化

LLM 推理优化探微 (3) :如何有效控制 KV 缓存的内存占用,优化推理速度?

Baihai IDP

程序员 AI LLM 白海科技 大模型推理

microsoft office ltsc 2021最新永久密钥分享 Mac/win

Rose

office2021 Mac破解版 office2021密钥 office ltsc 2021中文版

团队管理者应该参与编程吗?

刘华Kenneth

编程 管理

脑机接口+AI,会让人类进化到什么阶段?

算法的秘密

MediaHuman YouTube Downloader mac(YouTube视频下载工具)v3.9.9.89中文注册版

影影绰绰一往直前

Video Converter X2 for Mac(功能齐全的视频格式转换器)v1.3.1激活版

影影绰绰一往直前

dynamic wallpaper怎么设置动态屏保?dynamic wallpaper破解下载

Rose

Dynamic Wallpaper下载 Mac壁纸app 动态屏保

Photoshop 2024 透视变形功能介绍

Rose

Photoshop 2024直装版 透视变形 ps2024教程

如何正确定义性能瓶颈

老张

性能优化 性能测试 性能基线

Aiseesoft iPhone Unlocker for Mac(苹果设备解锁工具)v2.0.38激活版

影影绰绰一往直前

搭建拍卖直播商城平台最新商业模式,让你实现多元化盈利

软件开发-梦幻运营部

Garden Planner for Mac(园林绿化设计软件)v3.8.59注册激活版

影影绰绰一往直前

OpenSearch 与 Elasticsearch:哪个开源搜索引擎适合您?

极限实验室

搜索引擎 elasticsearch opensearch service

After Effects 2023中文版下载 及 ae2023介绍

Rose

adobe After Effects 2023下载 AE2023中文直装版

Capture One Pro 23 飞思 最新中文版 摄影调色软件

Rose

Capture One Pro 23 飞思 摄影调色软件 摄影后期

如何在 Parallels Desktop for Mac 中备份、恢复或转移 Windows 虚拟机

Rose

虚拟机 Windows系统 Parallels Desktop教程 备份、恢复或转移

AI微调营 毕业总结

Ksnshejn

Dynamic Wallpaper for Mac(Mac动态壁纸桌面)v17.5中文版

影影绰绰一往直前

Aiseesoft iPhone Cleaner for Mac(ios清理工具)v1.0.30中文激活版

影影绰绰一往直前

青否数字人直播的无限续写功能到底有多牛!

青否数字人

数字人

汉化版数据库 Navicat for SQL Server mac永久使用

Rose

数据库 SQL Server Navicat 数据库下载

香水界的黑科技:AI助力设计新香型

算AI

人工智能 创新

Java中的SAMbdas_Java_Alex Blewitt_InfoQ精选文章