Richard Warburton是一位经验丰富的技术专家,善于解决复杂深奥的技术问题,拥有华威大学计算机科学专业博士学位。近期他一直从事高性能计算方面的数据分析工作。他是英国伦敦Java社区的领导者,组织过面向Java 8中Lambda表达式、日期和时间的Adopt-a-JSR项目,以及Openjdk Hackdays活动。Richard还是知名的会议演讲嘉宾,曾在JavaOne、DevoxxUK和JAX London等会议上演讲。根据对Java社区和Java 8新特性的深刻理解,他创作了《Java 8函数式编程》一书。

问:你是如何成为一位程序员的?又如何成为一位擅长Java的程序员?

一直以来我都对科技很感兴趣,在学校的时候我交友不慎,和程序员群体成为了朋友。能遇见这些可以制作有用又有趣东西的人还是还是很不错的。所以我从一本关于Visual Basic的书学起(这是我学的第一种编程语言),读完了就开始敲代码。随后我发现Visual Basic作为一种编程语言还有很多让人不满的地方,在大学的时候,我学习了Java。虽然我也用过其他编程语言,但是最终我总是重新回到Java。相比于语言本身,更吸引我的是Java已有的生态环境、工具,以及库。

问:你在伦敦Java社区的经历是否帮助你创作了《Java 8函数式编程》这本书?

绝对是这样。通过组织伦敦Java社区“黑客日”关于Java 8的活动,我把反馈发送给了专家组,所以在Java 8正式发布之前,我就已经摆弄过Java 8的原型。同时,我也在伦敦的活动中接触到了O'Reilly,如果没有伦敦Java社区,《Java 8函数式编程》这本书就不会存在。

问:lambda在JVM中是不可见的,为什么没有通过把lambda做成插件来支持这一语法特性,而是把lambda融合到了Java 8中?

我认为这是很多其他关于Java 8的设计决策造成的结果。他们很早就已经确定,不会增加特殊函数类型来代表lambda——而是使用具有单一抽象方法的接口(函数式接口)。一旦如此,任何想要调用lambda表达式的库只要调用一个接口的一个方法就可以了。要实现这些我们不再需要改变字节码。

为了让lambda工作而搞出一堆技术结构来是没有任何意义的,在我共同执笔的文章中,我详述了这个观点:http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood

问:Scala、Groovy及Clojure从根上就有函数化编程基因,与它们相比Java是否具有哪些独特的优势?

当然有,但是亮点不在语言上!Java是一种绝对可靠的语言,但是像Scala这样的语言总是可以添加更多的特性。Clojure永远都会更简单,语法更少、概念更少。Groovy能够混合着提供静态类型和动态类型,同时也能提供Java所或缺的脚本处理。相比于Java,所有这些语言都有其独特的吸引力,但是同时它们也缺少很多其他东西。

Java拥有优秀而成熟的工具,同时它对IDE的支持也是像Scala和Clojure这样的语言所缺少的。对于我来说,这些工具对生产效率的影响和语言本身一样重要,好的工具可以帮你扫除很多日常开发中的麻烦。因为有这些强有力的工具,在很多项目上我都会优先选择Java,而不是Scala或Clojure。

问:Java的最大优势在于稳定和简单,Java 8的函数化编程以及Java 9的多继承机制会不会导致Java的复杂度提升、代码的维护度成本提高?

这取决于你看问题的角度。我认为引入函数式编程会为很多编程任务提供方便。采集和数据处理是Java程序员经常需要完成的任务,而函数式范式是解决这类问题的理想手段。确实,学习这些新概念确实会造成额外的成本,同样,当你需要决定编写函数式代码还是命令式代码时确实会增加其复杂性。所以对于我来说并没有一个绝对的答案。函数式编程会让问题更简单,但是需要学的还有很多。

问:目前Java生态对Java 8函数式编程的支持情况如何?作为新特性,您预测Java 8函数式编程进入全面使用大概还需要多长时间?

如果你想要采用Java 8的话,就需要一步一步慢慢来。首先考虑的是和lambda表达式一起联合使用核心库特征,比如数据流(Stream)和采集器(Collector)。我认为我们现在已经进入了逐步采用的阶段,我已经见到很多人把这些特性用在了真实的代码中。

随着时间推移,我相信我们即将看到Java演进成更具有函数式风格的语言——使用某些函数式设计模式,更多的不可变类。已经有一些库开始采用这样的样式。我编写了一个测试框架(http://richardwarburton.github.io/lambda-behave/)作为例子抛砖引玉,还有很多其他东西可以做。

所以我的结论是最终Java 8的函数式特性会得到全面采用,但是这是一个循序渐进的过程。

问:之前的Java是面向对象的,现在全面支持函数式编程。作为开发者,我们需要做出哪些转变才能发挥函数式编程的力量?

我认为这个转变需要几步来完成。

第一步,学习更多关于Java 8的知识。读书、读tutorial,然后尝试几个简单的函数式代码的例子。掌握了基础之后,就可以进行第二步了。

第二步,在工作项目上使用Java 8。我觉得在一个低风险的小项目上练一练手确实不错,但是在真实商业世界的背景下解决问题效果则更好。一旦你在真实世界的设置下熟悉了Java 8,就可以移步到第三步了。

第三步,把所有代码部署到Java 8上,并在不使用任何Java 8特性的前提下对其进行全面测试。这样做是因为虽然Java SE维护了很强大的二进制兼容性,但是某些第三方库可能会崩溃,那时你就必须得升级这些库。如果你已经使用了最新的库,那么这一步对你来说就不成问题。一旦万事俱备,就可以开始第四步了。

第四步,在你整个主代码库上使用Java 8,并且乐在其中。

问:在你使用Java进行函数式编程的过程中,是否有哪些最佳实践值得推荐?一路上是否遇到过哪些坑?

我从来都不太喜欢“最佳实践”这个词,这些东西都是随着时间变化的,而且依赖于不同背景。但是我们可以来说一说那些用起来得心应手的好东西。

  1. 数据流(Stream)和采集器(Collector)。如果你编写的代码需要采集API,那么这些特性就是你最好的朋友。

  2. 不可变数据。一般来说,返回新的对象比改变已有的对象更简单,也更不容易出错。

  3. 函数式思考方式。与其想“我怎么才能升级这个Blob的状态?”不如问自己:“我怎么才能把这个输入转为输出呢?”


更多精彩,加入图灵访谈微信!