我学习了函数式编程,但是后来我决定我更喜欢命令式编程,于是我转回去。
—没人
从命令式编程过渡到函数式编程是当今非常普遍的事情。 互联网上的博客文章充斥着关于它的证词。 我读过的所有内容以及与我交谈过的每个人(包括我自己)都有相同的故事。 一旦他们开始函数式编程,就不会再回头了。 他们喜欢它,在早期,即使他们学到的很少,他们也渴望
学到更多。
在我看来,从命令式编程到函数式编程是交通繁忙的必经之路。 这是一个二极管,两端有一百万伏特的电压。 这是自来水管道上的止回阀。 您不仅不能回头,而且还带有无法抗拒的探索和学习更多知识的欲望,这使您进一步进入函数式编程。
Java 8 Lambdas
随着Java 8 lambda的到来,这为地球上最大的一组开发人员之一带来了一个有趣的转折点。 Lambda本身不一定等同于函数式编程。 但是他们确实启用了它。 随着这里的开发人员开始涉足函数式编程(那里是库维护者),我们将开始看到Java源代码中的一些新事物。 以前可能返回null
将开始返回Optional
。 执行IO的库(例如HTTP客户端库)将开始返回CompletableFuture
。 越来越多的功能概念将开始渗透到Java接口中,将有称为fold,map,reduce,collect的方法。 因此,这将开始Java大众从命令式编程过渡到函数式编程的单一方式。
但是Java是否可以满足他们的需求? 看着Lambda规格,我怀疑不是。 我在Lambda规范中看到了一个天才的精髓,它使Lambdas可以立即使用许多现有的库,而无需进行任何更改。 这是因为Lambda只是用于实现单抽象方法(SAM)接口的语法糖。 在Java中,随处可见SAM,从并Callable
中的Runnable
和Callable
到Swing中的ActionListener
,再到Guava中的Function
和Supplier
,列表将不胜枚举。 所有这些库今天都已准备就绪。
但是,这也带来了问题。 开始编写事物时,函数式编程会变得很有趣。 传递函数并将它们组合在一起的能力提供了强大的功能-但是Java 8 Lambda并不是可组合的。 Java 8确实提供了Future
SAM,但是Guava和许多其他库也提供了。 要将它们组合在一起,您需要组合方法的所有排列。 至少,不是以传统的Java方式,两个相同类型的SAM甚至都不是很容易组成,因为您不能向SAM添加任何方法(例如map或transform方法)来进行合成。
因此,如果没有能力执行最基本的功能概念之一(组成功能),Java能否成为一种功能语言? 也许有一些我没有想到的创造性方法可以解决这个问题。 也许并不需要,我认为Java 8 Lambda的设计者无意将Java变成一种功能语言,因此您不能将其称为Lambda规范的错误。 但是问题是,正如我早先指出的那样,对函数式编程有所了解的开发人员将想要更多,并且想要更快。 即使Java可以成为一种功能语言,我也认为它不会跟上Java开发人员向功能编程的发展。
所以我要做个预测。 Java 8 Lambdas将被急切采用。 如此急切地将Java本身抛在后面,并且大多数Java开发人员将转向一种能够满足他们需求的语言,因为他们迫切需要新的函数式程序员。
哪种语言?
在推测Java开发人员将使用哪种语言之前,首先让我确定一下我既有偏见又无知。 我为Typesafe工作,因此显然偏向于Scala。 除了在大学与Haskell和ML一起玩之外,我从没有在生气时使用任何其他功能性语言。 因此,我一言不发,如果您不同意,请撰写自己的博客文章。
Scala作为一种过渡语言
因此,首先,我认为Scala为命令式程序员切换到函数式编程提供了一种很棒的过渡语言。 对Java 8 Lambdas的函数式编程有所了解之后,Java开发人员会发现自己在Scala中非常满意。 他们仍然可以按照以前的方式进行所有操作,拥有vars和mutable集合,并且掌握了所有标准的Java库。 当然,他们可以开始加深对函数式编程的了解。 因此,Scala提供了从命令式编程到函数式编程的平稳过渡,您可以根据需要快速或缓慢地采用函数式编程。
Scala作为目标语言
过渡到函数式编程后,开发人员会留在Scala,还是会像从Java迁移一样继续寻找更纯净的语言? 我的意见是不。 从广义上讲,我看到了函数式编程社区中的两个阵营。 第一个阵营将功能编程视为必须遵循的一组法律。 对于这个营地,Scala有很多不必要和/或危险的事情,他们可能不会将Scala视为最终目的地。
第二个阵营将函数式编程视为应被广泛利用的强大工具,而不是必须遵循的一组法律。 我站在这里,Scala很好地满足了该营地的需求。 函数式编程在Scala中提供了一流的支持,但您总是可以在需要时退回到当务之急。 我怀疑大多数Java社区都倾向于加入这一阵营,否则,他们将已经回避Java并编写Haskell。 因此,我认为Java 8 Lambda对于Scala将会非常有用,因为它们使Java开发人员可以了解Scala将为他们做些什么,从而将大量精力集中到Scala开发中。
参考: Java 8 Lambdas – James and Beth Roper的博客博客中缺少我们的JCG合作伙伴 James Roper 离开Java 的链接 。
翻译自: https://www.javacodegeeks.com/2013/04/java-8-lambdas-the-missing-link-to-moving-away-from-java.html