【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

Java Lambda 语法的首个版本引发众多争论

  • 2010-06-22
  • 本文字数:1618 字

    阅读完需:约 5 分钟

近日,Oracle 的 Maurizio Cimadamore 在 OpenJDK Mercurial 仓库发布了初始的 lambda 实现,这让我们有机会首次目睹该新语法的容貌,同时也引发了社区的广泛争论。

目前的原型支持如下特性:

下面的代码片段声明了一个简单的 lambda 表达式,该表达式接收一个整型,加一后返回:

复制代码
int i1 = #()(3).();
assertTrue(3 == i1);
Integer i2 = #()(3).();
assertTrue(3 == i2);
int i3 = #(int x)( x + 1 ).(3);
assertTrue(4 == i3);
int i4 = #(Number x)(x.intValue()).(new Float(3.0f));
assertTrue(3 == i4);
Object o = #()(3);
assertTrue(o != null);

该原型支持规范草案所描述的语法,如果想要更好地了解语法,读者可以看看衰退 测试

因为 Java 通常使用长单词而非符号,因此有很多人觉得这种语法太笨拙,并不符合语言本身的感官。

来自 Ajaxian 的 Dion Almaer 认为这种语法更接近于 Perl 而非 Java

Integer i2 = #()(3).(); //i2 = 3
int i4 = #(Number x)(x.intValue()).(new Float(3.0f)); //i4 = 3 Erm, Java? Or Perl!!

无独有偶,Ruby on Rails 的创始人 David Heinemeier Hansson 认为这种语法太乱

Java 7 新的闭包语法:int i4 = #(Number x)(x.intValue()).(new Float(3.0f));——这一行也太长了吧!

不少 Java 开发者在论坛和讨论组上抨击这种 lambda 语法:

Java Posse Group “吼吼,这也太恶心了吧。源代码乱的一团糟”。

“恩,这种恶心的语法倒是能够减轻编译器开发者的工作量。一定还有更好的方案能够解决这个问题。即便是 Obj-C 的块都比这强(至少语法比这强)”。

”为了保证向后兼容,Java 没法实现更优雅的解决方案,但现在这其实根本不算什么问题“。

Baptiste Wicht 的博文 ”一看到 int i1 = #()(3).(); 这一行我就无语了,第一眼还以为代码写错了呢“。

”肯定还有改进的空间。如果用 adder(1, 2) 代替 adder.(1, 2),我觉得会好很多,把点放在中间并不符合 Java 风格“。

Hacker News “这种语法太丑陋了”。

“从实践上来说,Java 并不会使用过多的符号。他们这帮人为什么要这么做呢?我并不是说反对他们(相对于长单词来说,我也更偏爱符号,虽说这会导致更长的学习曲线),但这与 Java 规范格格不入”。

另一方面,Nick Wiedenbrueck 认为该提案由来已久, Java 社区应该认识到将要发生什么

现在有几个提案,上次的 Devoxx 大会上也宣布了提案草案与规范草案,但社区并没有对此进行过充分的讨论。什么原因呢?我有一些假设。lambda 项目太安静了么?根本就没有几篇博文或是示例介绍 lambda。社区出什么问题了么?社区领域跑哪儿去了?难道都忙着学 Scala 去了?静态类型语言(没有类型推断)中的闭包就应该这么复杂么?

最后,该原型的创建者之一的 Brian Goetz 说到,在进入到产品阶段前还会继续改进语法

记住,这只是早期的概念验证阶段。这里面的语法都是暂时的,随着 Lambda 项目的不断发展,语法也会发生很大的变化。同时,还有很多比语法重要的东西,我们的全部精力都放在这上面了——语法要为之让路。

InfoQ 上有篇深度探索面向Java 语言的Lambda 的文章,感兴趣的读者不妨移步一观(文章包含了为何当前的语法是adder.(1, 2) 而不是adder(1, 2))。

社区观点: InfoQ 中文站.NET 社区编辑赵劼针对 Java Lambda 表达式专门发表了一篇题为《浅谈Java 7 的闭包与Lambda 表达式之优劣》的博文,深入浅出地探讨了Java Lambda 表达式的使用方式及其缺陷,博文以大量的实例阐述了目前Java Lambda 表达式的种种硬伤,读者可以从中了解到当前Java Lambda 表达式的现状。此外,该文的评论也很丰富,包含了很多有意义的信息,会对读者起到一定的帮助作用。

查看英文原文: First Version of Java Lambda Syntax Sparks Debate

2010-06-22 05:073419
用户头像

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

关注

评论

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

Java程序的构造与执行

李印

编程语言 JVM Java core 8月月更

React Server Components 介绍 亮点

HullQin

CSS JavaScript html 前端 8月月更

Kubernetes rubbish如何回收

CTO技术共享

开源 签约计划第三季 8月月更

开源一夏 | AngularJS实战之依赖注入与应用实践

恒山其若陋兮

开源 8月月更

Kubernetes eBPF多种玩法

CTO技术共享

开源 签约计划第三季 8月月更

首发!这份阿里强推的图文并茂的Mybatis 源码笔记将理论和实战完美结合

了不起的程序猿

Java 后端 mybatis JAVA开发 框架

LAXCUS授权许可证 第1版

LAXCUS分布式操作系统

开源 分布式操作系统 软件许可证

史上最全的Java并发系列之Java中的锁的使用和实现介绍(二)

自然

多线程 并发 8月月更

Vue讲解系列- - -Nginx和Postman讲解

叶秋学长

Vue 8月月更

MySQL 原理与优化:意向锁,IS,IX

老崔说架构

美团二面:如何解决 bin log 与 redo log 的一致性问题

飞天小牛肉

签约计划第三季

STM32入门开发 编写DS18B20温度传感器驱动(读取环境温度、支持级联)

DS小龙哥

8月月更

Forlend:构建在Findora上,且具备隐私特性的借贷协议

股市老人

开源一夏 | 使用 JavaScript 和 CSS 的简单字符计数器

海拥(haiyong.site)

开源 8月月更

计算机网络知识点全面总结(一篇全懂)

C++后台开发

网络编程 计算机网络 网络协议 底层原理 C/C++开发

2022最新发布!不愧是保姆级的SpringSecurity笔记

了不起的程序猿

Java spring 后端 JAVA开发 java程序员

体验家辛济云:CEM不是MarTech,不仅要“从0到1”,更要规避“从1到0”

B Impact

涨薪了!拿着GitHub标星80k的阿里性能优化笔记,把项目优化个遍

程序知音

Java 编程 程序员 性能优化 后端技术

大揭秘:云网流量采集方案关键点

阿泽🧸

签约计划第三季 8月月更 云网流量采集

阿里P8熬了一个月肝出这份32W字Java面试手册,在Github标星31K+

冉然学Java

Java 面试 springboot 秋招 java面试·

SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase

IT学习日记

数据库 分布式数据库 oceanbase 签约计划第三季 oracle迁移到oceanbase

五分钟搞定YAML

俞凡

云原生 yaml

千万级学生管理系统的考试试卷存储方案

张立奎

关于Http协议,你必须要知道的

TimeFriends

8月月更

为什么实际业务中不建议直接使用POI操作Excel?

IT学习日记

POI EasyExcel 签约计划第三季 java excel导出导入 poi和easyexcel对比

如何正确理解Java领域中的多线程模型,主要用来解决什么问题?

PivotalCloud

史上最全499道Java面试题:JVM+分布式+算法+锁+MQ+微服务+数据库

冉然学Java

Java 数据库 面试 算法 多线程

Kubernetes 动态扩缩容

CTO技术共享

开源 签约计划第三季 8月月更

构建在Findora上的Forlend,具备隐私特性的借贷协议

EOSdreamer111

废除“网络君主制”,认识 Usenet ~

掘金安东尼

前端 网络 8月月更

Kubernetes宕机切换源码分析

黄继承

源码分析 kubelet Kubernetes 集群 宕机

Java Lambda语法的首个版本引发众多争论_Java_Dio Synodinos_InfoQ精选文章