写点什么

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:073606
用户头像

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

关注

评论

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

一文带你了解微服务架构和设计(多图)

Phoenix

架构 分布式 微服务

CString 类的线程不安全问题

C语言与CPP编程

c c++ 编程语言

企业中台化落地:从战略分析到战术实践及架构演进过程

Barry的异想世界

架构设计 策略模式 模板方法模式 中台架构 领域驱动设计DDD

金沙账号审核不通过维护不给提现风控怎么回事?怎么办

过山太阳

内容审核 提现不了

HashMap将cpu打满始末

hashmap 线程安全 cpu 100% cpu飙满

认证、授权、鉴权和权限控制

哈库拉玛塔塔

spring security 用户权限 鉴权 权限

第五周作业

Vincent

极客时间 极客大学

为什么每个微服务要有自己独立的数据库?

码猿外

数据库 架构 微服务

SpringCloud轻松集成Dubbo实现RPC调用

Barry的异想世界

微服务 dubbo nacos RPC spring cloud alibaba

区块链应用层——生态体系的上层建筑

CECBC

区块链技术 生态体系

浮点数的秘密

C语言与CPP编程

c c++ 编程语言 浮点数

我理解的面向对象(ObjectiveSql 实践)

Braisdom

Java ORM框架 ORM

Go: 理解 Sync.Pool 的设计

陈思敏捷

sync sync.pool pool Go 语言

从一段 Dubbo 源码到 CPU 分支预测的一次探险之旅

yes

dubbo cpu

week11--作业

Geek_165f3d

Spring Security 主要类解释

哈库拉玛塔塔

springsecurity

不使用Raft算法,就能简单做集群leader选举

架构师修行之路

分布式 架构师

spark总结

纯纯

oeasy教您玩转 linux 010212 管道 pipe

o

【高并发】面试官:讲讲什么是缓存穿透?击穿?雪崩?如何解决?

冰河

缓存 穿透 击穿 雪崩 签约计划第二季

华为与第四范式,正在酝酿一个帮企业跳出AI悖论的“秘密计划”

脑极体

Golang领域模型-实体

奔奔奔跑

架构 微服务 领域驱动设计 DDD Go 语言

区块链激励层——区块链生态建设的驱动力量

CECBC

区块链技术 驱动力量

布式系统消息异常该何去何从

架构师修行之路

分布式 异步

计算机的时钟(三):向量时钟

ElvinYang

LeetCode 169. Majority Element

liu_liu

算法 LeetCo

记录问题 INSERT INTO table ... SELECT ... FROM dual WHERE not exists (...)问题

转山转水

sql SQL语法 sql查询

重新学习了一遍ThreadLocal

熊斌

学习

Java四种引用类型:强引用、软引用、弱引用、虚引用

简爱W

我们该怎么保护手机屏幕前的父母?

徐说科技

手机 短视频

以大数据为依托提升基层治理效能

CECBC

大数据 信息化管理

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