Lambda表达式现状分析

标签: lambda 表达式 现状 | 发表时间:2013-01-22 18:13 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

距明年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中文站投稿或者参与内容翻译工作,请邮件至 [email protected]。也欢迎大家通过新浪微博( @InfoQ)或者腾讯微博( @InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

您可能也会喜欢

相关 [lambda 表达式 现状] 推荐:

Lambda表达式现状分析

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

[Java 8] Lambda 表达式实例

- - Java - 编程语言 - ITeye博客
Java 8 中的 Lambda 表达式,允许将函数作为形参传递给另外的函数. 为了更好地理解,我们用实例的方式来演示如何使用 Lambda 表达式. 1、Lambda 表达式 Hello World. 这是一个最简单的 Lambda 表达式的例子. 首先在 main 方法的上面声明了一个接口 HelloWorld,在 main 方法中实现了这个接口,随后调用了接口的唯一方法.

Java8集合中的Lambda表达式

- - 四火的唠叨
文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》. 本文翻译自《 Java 8 Explained: Applying Lambdas to Java Collections》. Lambdas表达式是Java 8的主题,在Java平台上我们期待了很久. 但是,如果如果我们不在集合中使用它的话,就损失了很大价值.

基于C++ Lambda表达式的程序优化

- sunnyboy.xue - 搜索研发部官方博客
这是一个关于C\C++程序员的一个小故事,关于C++11——刚刚通过的新标准的一个小故事…. 请不要误会,题目中所提及的“优化”并不是提升程序的性能——Lambda表达式干不了这个. 从本质上来说,它只是一种“语法糖”而已. 不使用这种表达式,我们照样可以写出满足需求的程序. 正如放弃C而使用汇编,或者放弃汇编而使用机器语言一样,你能控制的范围就在那里,不增不减.

【译】为什么要在Java中加入Lambda表达式

- - Java - 编程语言 - ITeye博客
原文:http://www.lambdafaq.org/why-are-lambda-expressions-being-added-to-java/. 作者:Maurice Naftalin. Lambda表达式(以及闭包)在许多现代编程语言中都很普及. 在为什么要在 Java 平台加入 Lambda 表达式呢.

Java8之使用新JS解释器Nashorn编译Lambda表达式

- - 并发编程网 - ifeve.com
原文链接  作者: Tal Weiss  CEO of  Takipi   译者:踏雁寻花,xbkaishui  校对:方腾飞. 在最近的一篇 文章中,我了解了一下Java8和Scala是如何实现 Lambda 表达式的. 正如我们所知道的,Java8不仅对javac编辑器做了很大改进,它还加入了一个全新的项目—Nashorn.

探索Java语言与JVM中的Lambda表达式(译)

- - BlogJava_首页
探索Java语言与JVM中的Lambda表达式.     Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期 Java Magazine中的 一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法. (2013.01.02最后更新).

大数据Lambda架构

- - CSDN博客云计算推荐文章
1 Lambda架构介绍.          Lambda架构划分为三层,分别是批处理层,服务层,和加速层. 最终实现的效果,可以使用下面的表达式来说明. 1.1 批处理层(Batch Layer, Apache Hadoop).          批处理层主用由Hadoop来实现,负责数据的存储和产生任意的视图数据.

Oryx 2: Lambda architecture on Apache Spark, Apache Kafka for real-time large scale machine learning

- -

正则表达式

- - CSDN博客推荐文章
    正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征. 比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征.     正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址.