作为一名程序员,笔者从大学开始接触Java这门编程语言,还记得当时的版本是1.4,不过这个版本的寿命还挺长,目前在一些金融行业的存量系统中依然还有1.4版本的影子。从C/C++到Java,Java给我的第一印象,就是这门语言的语法非常之啰嗦,比如内部类,像下面这段排序的代码,在C语言里面可以很方便地通过函数指针来解决,C++可以通过运算符重载来解决,唯独Java语言的写法最为冗长,这可能跟在Java的世界里一切皆是对象的这一设计理念相关。
Collections.sort(list, new Comparator() {
@Override public int compare(Fruit o1, Fruit o2) {
return o1.getWeight() >= o2.getWeight() ? 1 : -1; }
});
大学毕业参加工作后,开始用到JDK1.6,带来的最大感受是终于支持泛型了,操作集合的时候终于不用各种类型转换了,即便他的实现还是个假的泛型,但是带来的方便也是非常明显的。转眼到了2014年3月份,今天的第一个主角Java8正式GA,这是一个里程碑式的版本,带来了巨量的升级,其中包括对函数式编程的支持,像上述的冗长的排序代码,通过使用一行代码即可搞定;除此之外,还包括对Streams支持,方便了开发者写出更加简洁、高效的代码;然后,在Java8中还引入了全新的日期操作API,极大地方便了开发人员对日期和时间的操作,关键是他还是线程安全的,原来那套旧的日期和时间操作的API极度难用,而且容易出错。最后,还引入了Optional这一特性,极大地方便了对NPE问题的处理。这些新的特性的加入,为Java这门语言注入了新的生机,大量的开发人员从中受益,从这也可以看出Oracle官方对这门语言还是非常地重视,也投入了大量的资源持续进行优化升级,所以大家可以继续依赖这门语言。
list.sort(Comparator.comparing(Fruit::getWeight));
图1是2020年统计的Java各版本的使用情况,Java8的占比还是非常之大的,足以说明这个版本取得了非常大的成功,也不得不承认Java8是一个划时代的版本,从另一方面也说明了Java8之前的版本确实也太差了。竞争就是这样,不进步就被淘汰。从Java8之后,Java的更新也开始进入了一个快车道,每半年就会发布一次数字更新,但很多都是临时版本,长期维护的版本则由Java自行宣布,当前8,11,17属于是LTS(长期维护版本),表1中列出了各个版本的官方维护时间。

图 1 2020年编程语言使用排名
| Release | GA Date | Premier Support Until | Extended Support Until | Sustaining Support |
|---|---|---|---|---|
| 7 (LTS) | July 2011 | July 2019 | July 2022 | Indefinite |
| 8 (LTS) | March 2014 | March 2022 | December 2030 | Indefinite |
| 9 (nonLTS) | September 2017 | March 2018 | Not Available | Indefinite |
| 10 (nonLTS) | March 2018 | September 2018 | Not Available | Indefinite |
| 11 (LTS) | September 2018 | September 2023 | September 2026 | Indefinite |
| 12 (nonLTS) | March 2019 | September 2019 | Not Available | Indefinite |
| 13 (nonLTS) | September 2019 | March 2020 | Not Available | Indefinite |
| 14 (nonLTS) | March 2020 | September 2020 | Not Available | Indefinite |
| 15 (nonLTS) | September 2020 | March 2021 | Not Available | Indefinite |
| 16 (non-LTS) | March 2021 | September 2021 | Not Available | Indefinite |
| 17 (LTS) | September 2021 | September 2026 | September 2029 | Indefinite |
| 18 (non-LTS) | March 2022 | September 2022 | Not Available | Indefinite |
| 19 (non-LTS) | September 2022 | March 2023 | Not Available | Indefinite |
| 20 (non-LTS) | March 2023 | September 2023 | Not Available | Indefinite |
| 21 (LTS) | September 2023 | **September 2028 ** | September 2031 | Indefinite |
表 1 Oracle对Java版本支持路线图
从表1中我们可以得出一些有用的信息,当然了,如果是付费企业可以忽略,付费企业是上帝。
作为一名程序员,保持持续充电是非常有必要,在Java8即将停止得到官方免费升级支持的时候,相信会有越来越多的项目将基于Java17进行构建和迁移,包括于2022年1月20号,大名鼎鼎的SpringBoot3.0释放第一个里程碑版本M1,该项目就是基于Java17构建的,是的,你没看错,这个项目就是使用Java17进行构建,依赖的相关组件很快将全部会进行升级,届时如果想使用一些新的特性,在Java8下将无法使用,因为根本无法通过编译,相信这将会是一个痛苦的开始。因此,在此时此刻,突然有一种冲动,突然想在这一块给自己充充电,停留在Java8的时代确实也有些年头了,担心再不学习和充电,后面新的开源代码还有项目中的新的源代码将看不懂了,届时可能被这个时代给抛弃了。IT就是这样,知识的更迭速度非常非常快,持续充电非常必要。
升级和使用新版本的Java带来的收益还是比较可观的,这里以升级Java17为例,首先可以借助新版本中新的语言特性和新的Java标准SDK,编写出更易于阅读和维护的代码,原来需要10行代码才能实现的功能,现在或许只需要一行代码就可以搞定了。在性能上,Java17还带来了不小的提升,具体可以参考相关测试链接,也就是说仅仅通过升级Java版本,就可以带来一次性能上的提升,想想还是挺划算的。新版本中还增加了一些新的库函数,比如更加好用的Http客户端API,终于可以摆脱Apache的HttpClient这个开源组件了。还有Record记录类这一新特性的加入,给经常写PO、DO、VO的开发人员也带来了福音。其他特性这里不再赘述,后面主要篇幅将详细的介绍从Java8到Java17这中间的一些变化和新的特性,通过学习和了解这些内容,能很快地从Java8转到Java17,当然了,对于有些新的特性,还是亲自动手去玩一遍,可能印象会更加深刻,效果也会更加好一些。