第 1 章 基础知识

Java 8 的最大变化是引入了函数式编程(functional programming)的概念。具体而言,Java 8 增加了 lambda 表达式(lambda expression)、方法引用(method reference)和流(stream)。

如果读者尚未接触过这些新增的函数式特性,或许会惊讶于写出的代码和之前大相径庭。Java 8 的变化堪称迄今为止这门语言最大的变化。从许多方面来说,这与学习一门全新的语言并无二致。

读者或许会问,这样做的目的是什么?为什么要对一门已有 20 年历史且计划保持向后兼容性的语言做出如此巨大的改变?一门为各方所公认的成熟语言,是否需要这些重大的修改?作为这些年来最成功的面向对象语言之一,Java 为何要转向函数式范式?

答案在于,软件开发领域已经发生变化,希望今后依然立于不败之地的语言同样需要适应这种变化。20 世纪 90 年代中期,在 Java 刚问世时,摩尔定律 1 仍然被奉为金科玉律。人们只需等上几年,计算机的运行速度就会提高一倍。

1由仙童半导体公司(Fairchild Semiconductor)和英特尔联合创始人戈登 • 摩尔(Gordon Moore)提出。根据观察,大约每 18 个月,封装到集成电路中的晶体管数量将增加一倍。参见维基百科的“摩尔定律”词条。

如今,硬件不再依赖于通过增加芯片密度来提高速度。相反,连手机都已大部分配备了多核处理器,这意味着编写的软件需要具备在多处理器环境下运行的能力。函数式编程强调“纯”函数(基于相同的输入将返回相同的结果,无副作用存在)以及不可变性,从而简化了并行环境下的编程。如果不引入任何共享、可变的状态,且程序可以被分解为若干简单函数的集合,就更容易理解并预测程序的行为。

不过,本书并非一本介绍 Haskell、Erlang、Frege 或任何其他函数式编程语言的教程,而是侧重于探讨 Java 以及它所引入的函数式概念。从本质上讲,Java 仍然是一门面向对象的语言。

Java 目前支持 lambda 表达式,它本质上是被视为一类对象(first-class object)的方法。Java 还增加了方法引用,允许在任何需要 lambda 表达式的场合使用现有的方法。为利用 lambda 表达式和方法引用,Java 引入了流模型。流模型生成元素并通过流水线(pipeline)进行传递和过滤,无须修改原始源代码。

本章的范例将介绍 lambda 表达式、方法引用与函数式接口(functional interface)的基本语法,并讨论接口中的默认方法和静态方法。有关流的详细讨论,参见第 3 章。