低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

Lambda 表达式现状分析

2013 年 1 月 22 日

距明年 Java 8 发布还有不到一年时间,Brian Goetz 发布了最新的 Lambda 表达式现状分析,涵盖了 Java 集合 API 的改进 。Java 8 最受期待的特性之一是引入了 Lambda 表达式,Java 集合 API 对它的重点支持是确保该类库被广泛使用的关键所在。如果你不熟悉 Lambda 表达式的语法,请查看先前的一篇文章 Lambda 表达式现状分析以及之前 InfoQ 的相关报道,以便了解该语法的详细内容。

因为替换整个集合库不现实,所以有必要扩展该库以支持 Lambda 表达式。与现如今用的外部实现(例如迭代器和枚举)截然相反,该计划打算使用内部迭代器(也就是,在集合中将 Lambda 表达式传递给 forEach)。新添加的接口 Stream 将支持值序列,以及 stream() 之类的方法将集合转换为 Stream。

Stream 和普通的集合不同,它不需要存储空间(所以可以是无限大或按需读取),它实际上是以函数方式处理,并且能够延迟生成。例如,我们可以创建一个代表素数的 Stream,让每个新元素产生序列中的下一个素数。

Stream 接口还将提供大量的函数处理方法,包括 forEach()、filter()、fold()、anyMatch()、map() 以及 flatMap()。该接口能以适当的方式构造集合所使用的具体类型,或为了其他类参与,它以通用方式实现。延迟意味着使用类似 findFirst 之类的方法,可以使用、过滤、匹配 Stream。当找到第一个匹配元素时,这会被触发并立即停止,无需遍历整个集合。集合现状分析一文中有个类似的例子:

复制代码
Optional<Shape> firstBlue =
shapes.stream()
.filter(s -> s.getColor() == BLUE)
.findFirst();

java.util.function 包将提供入门级别的函数接口,例如 Predicate、Function、UnaryOperator 以及 BinaryOperator,该理念是为了让开发者还能够添加自定义的函数接口类型。该函数包还引入了新类型 Optional,它提供了表示潜在 null 值的机制。该包装类要么保存类的单例,要么以对象安全的方式表示 null 值。正如上个月一个细长的邮件线索中讨论的那样,并不是所有人都满意这个设计。其他语言,例如Scala 和Haskell,提供了更多的Monad 方式的Optional 的函数视图。但Brian Goetz,“如果有人对我们没将Java 变成Scala 或者Haskell 感到不爽,那么抱歉,我们没有这么做。”,他还“少数人其实很容易就能冒充社区的声音”。与此同时一些强类型以及小众语言在函数设计上将更进一步,数以万计的Java 开发者鲜有熟悉函数式编程,为最多数开发者谋求利益最大化是Oracle 的首要目标。

在Java 语言中加入Stream 和函数还可让操作并行执行。假设给定数据的逻辑Stream,结果可分割成不同级别的数据块,然后交给fork/join 之类的并行处理架构。当前的提案引入了Spliterator,它可将大数据块分割成更小的适合并行处理的数据块。通过暴露分割数据结构为更小单元的一般性方法,在允许fork/join 框架操作通用数据集合的同时,数据结构能够提供数据的有效部分。

最后,似乎人们对Lambda 表达式的热爱正在往EL(表达式语言)中渗透,它是Java EE 的一部分。先前有LINQ 这样执行数据处理的概念,但随着即将到来的Lambda 表达式支持,EL决定应该接纳某些Lambda 表达式语法,以便更大程度兼容Java 语言。这将推迟EL 项目的设计完成时间至今年年底,最终将于2013 年一季度发布。

查看英文原文 State of the Lambda


感谢贾国清对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013 年 1 月 22 日 04:132003
用户头像

发布了 27 篇内容, 共 68969 次阅读, 收获喜欢 3 次。

关注

评论

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

LeetCode题解:433. 最小基因变化,BFS+生成所有可能新基因再匹配,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

产品经理训练营笔记-产品思维和产品意识(下)

.nil?

产品经理训练营

真正牛逼的人,都是极简主义者!!

冰河

产品 程序 极简主义

CSS(九)——盒子的浮动与定位

程序员的时光

程序员 七日更 28天写作

《小狗钱钱》读书笔记

架构精进之路

读书笔记 七日更 28天写作

“复制”马斯克(三):我们要为他的“反智事业”买单吗?

脑极体

设计模式: 工厂模式

爱笑的小雨

设计模式 23种设计模式 Java设计模式

架构师训练营第 2 期 第 8 周 作业一

老坛酸菜

架构师训练营第2期

《程序员修炼之道》- 务实的方法(5)

石云升

28天写作 程序员修炼之道 评估工作量

传统线程互斥技术 synchronized

武哥聊编程

Java 多线程 synchronized 28天写作

面试学习!月薪20k+的Android面试都问些什么?终获offer

欢喜学安卓

android 程序员 面试 移动开发

webpack | 谈谈webpack的本质

梁龙先森

前端 前端工程 webpack 28天写作

设计模式简单讲 - 适配器设计模式

小马哥

Java 设计模式 架构师 七日更

2021年春招,Java后端最全面试攻略,吃透25个技术栈

Crud的程序员

Java 程序员 架构

学习JAVA8个月,成功跳槽,外包进阿里成功定级P7,太牛了!

云流

Java 编程 程序员 面试

故乡的年

熊斌

28天写作

阿里架构师集一生内力编撰的笔记,到底有什么干货?

Java架构师迁哥

蚂蚁二面遭调优猛击,我闭关啃透485页性能实战手册,入职京东

互联网架构师小马

性能优化

mPaas上线应用检测

阿里云金融线TAM SRE专家服务团队

ios android RPC

NullPointerException 的处理新方式,Java14 真的太香了!

xcbeyond

Java java 14 新特性 28天写作

贪心算法

en

算法 贪心算法

【Linux系统】关于守护进程

程序员架构进阶

Linux 架构 守护进程 28天写作

批判性思维自修课(四)

石君

28天写作 批判性思维

《破壁MySQL》 - MySQL索引

haxianhe

MySQL

管理笔记[2]:独裁者X与民主统治者Y

俊毅

半导体芯片小白基础知识(2) (28天写作 Day23/28)

mtfelix

集成电路 28天写作 晶圆 光刻机 晶圆代工

Redis击穿、穿透、雪崩产生原因以及解决思路

Java架构师迁哥

阿里内部Redis宝典意外流出极致经典:源码+实战+理论

比伯

Java 编程 程序员 架构 面试

九大核心专题,630页内容,熬夜23天吃透,我收割了3个大厂offer

周老师

Java 编程 程序员 架构 面试

深入浅出Android!阿里P7深入Binder原理讲解,论程序员成长的正确姿势

欢喜学安卓

android 程序员 面试 移动开发

开发质量提升系列:表字段名称引发的血案

罗小龙

代码规范 28天写作

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

Lambda表达式现状分析-InfoQ