在 JavaOne 2013 的技术主题演讲中,Oracle Java 平台组首席架构师 Mark Reinhold 将 lambda 表达式描述为 Java 编程模型有史以来最大的一次升级。虽然 lambda 表达式有很多应用程序,但本文主要关注数学应用程序中经常出现的一个特定示例;也就是说,需要将函数传递给算法。
数学中的许多应用要求函数作为参数传递给算法。大学代数和基础微积分的例子包括解方程或计算函数的积分。15 年来,Java 一直是我在大多数应用程序中选择的编程语言,但它是我经常使用的第一种语言,它不允许我以简单、直接的方式将函数(从技术上讲是指向函数的指针或引用)作为参数传递。随着即将发布的 Java8,这个缺点即将改变。
lambda 表达式的功能远远超出了单个用例,但是研究同一示例的各种实现应该让您对 lambda 将如何为 Java 程序带来好处有一个明确的认识。在本文中,我将使用一个常见的例子来帮助描述问题,然后提供在 C++中使用 java 语言编写的解决方案,在 lambda 表达式之前使用 java,以及用 lambda 表达式来编写 Java。请注意,理解和理解本文的要点并不需要有很强的数学背景。
数学示例中的 Lambda 表达式
本文中使用的示例是基本微积分中的辛普森规则。辛普森规则,或者更具体地说是复合辛普森规则,是一种近似定积分的数值积分技术。如果你不熟悉定积分的概念,不要担心;您真正需要了解的是,辛普森规则是一种基于四个参数计算实数的算法:
-
我们想要集成的函数。
-
两个实数 a 和 b,表示实数线上区间[a,b]的端点。(请注意,上述功能在此时间间隔内应是连续的。)
-
指定子间隔数的偶数整数 n。在执行辛普森规则时,我们将区间[a,b]划分为 n 个子区间。
为了简化演示,让我们关注编程接口,而不是实现细节。(老实说,我希望这种方法能让我们绕过关于实施辛普森规则的最佳或最有效方法的争论,这不是本文的重点。)我们将对参数 a 和 b 使用类型 double
,对参数 n 使用类型 int
。要集成的函数将接受类型 double
的单个参数,并返回类型 double
的值。
C++中的函数参数
为了提供比较的基础,让我们从 C++规范开始。当在 C