1.1 为什么需要再次修改Java
1996年1月,Java 1.0发布,此后计算机编程领域发生了翻天覆地的变化。商业发展需要更复杂的应用,大多数程序都跑在功能强大的多核CPU的机器上。带有高效运行时编译器的Java虚拟机(JVM)的出现,使程序员将更多精力放在编写干净、易于维护的代码上,而不是思考如何将每一个CPU时钟周期、每字节内存物尽其用。
多核CPU的兴起成为了不容回避的事实。涉及锁的编程算法不但容易出错,而且耗费时间。人们开发了java.util.concurrent包和很多第三方类库,试图将并发抽象化,帮助程序员写出在多核CPU上运行良好的程序。很可惜,到目前为止,我们的成果还远远不够。
开发类库的程序员使用Java时,发现抽象级别还不够。处理大型数据集合就是个很好的例子,面对大型数据集合,Java还欠缺高效的并行操作。开发者能够使用Java 8编写复杂的集合处理算法,只需要简单修改一个方法,就能让代码在多核CPU上高效运行。为了编写这类处理批量数据的并行类库,需要在语言层面上修改现有的Java:增加Lambda表达式。
当然,这样做是有代价的,程序员必须学习如何编写和阅读使用Lambda表达式的代码,但是,这不是一桩赔本的买卖。与手写一大段复杂、线程安全的代码相比,学习一点新语法和一些新习惯容易很多。开发企业级应用时,好的类库和框架极大地降低了开发时间和成本,也为开发易用且高效的类库扫清了障碍。
对于习惯了面向对象编程的开发者来说,抽象的概念并不陌生。面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象。现实世界中,数据和行为并存,程序也是如此,因此这两种编程方式我们都得学。
这种新的抽象方式还有其他好处。不是所有人都在编写性能优先的代码,对于这些人来说,函数式编程带来的好处尤为明显。程序员能编写出更容易阅读的代码——这种代码更多地表达了业务逻辑的意图,而不是它的实现机制。易读的代码也易于维护、更可靠、更不容易出错。
在写回调函数和事件处理程序时,程序员不必再纠缠于匿名内部类的冗繁和可读性,函数式编程让事件处理系统变得更加简单。能将函数方便地传递也让编写惰性代码变得容易,惰性代码在真正需要时才初始化变量的值。
Java 8还让集合类可以拥有一些额外的方法:default方法。程序员在维护自己的类库时,可以使用这些方法。
总而言之,Java已经不是祖辈们当年使用的Java了,嗯,这不是件坏事。