背景

Java8的前世今生

作为一名程序员,笔者从大学开始接触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));

Oracle的商业支持

图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中我们可以得出一些有用的信息,当然了,如果是付费企业可以忽略,付费企业是上帝。

  1. Java8将在2022年3月份停止维护,如果这之后遇到问题,有两种办法,第一,自己想办法解决,这对一些技术比较强的IT企业可能并不是什么难题,但是技术一般的企就不一定能搞得定了。第二,花钱买服务,找官方支持。相信国内99%以上的企业用的都是在免费使用Java。
  2. Java11也并不是一个安全和稳妥的升级目标版本,在2023年7月份,Oracle官方对Java11的支持也将结束,此时,替从Java8迁移到Java11的用户感到有些不值,下次升级一定要看准了再升,当然了,如果是新应用直接使用Java11,那么后面基本可以无感升级到后续版本。
  3. Java8将在2022年3月停止维护,那么下一次值得升级和使用的版本就是Java17了,这个版本在2021年11月正式GA,官方将公开支持到2026年11月份,而且也是一个LTS版本,更为关键的是,这个版本可以免费商用,此时此刻全场欢呼有没有。

持续充电

作为一名程序员,保持持续充电是非常有必要,在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,当然了,对于有些新的特性,还是亲自动手去玩一遍,可能印象会更加深刻,效果也会更加好一些。