BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Lambda表达式现状分析

| 作者 Alex Blewitt 关注 4 他的粉丝 ,译者 雷慈祥 关注 1 他的粉丝 发布于 2013年1月23日. 估计阅读时间: 5 分钟 | 都知道硅谷人工智能做的好,你知道 硅谷的运维技术 也值得参考吗?QCon上海带你探索其中的奥义

距明年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)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT