java的作用

52 阅读3分钟

关注 Java,一门广受赞誉,却又饱受诟病的语言,在从其诞生至今,便无时不刻的被于其他语言对比,有时候这种对比是空穴来风的诽谤,但更多的是对这门语言未来的担心,而近 10 年来涌现的一个又一个新生的程序语言更是让 Java 一次又一次地被推上风口浪尖,使公众一次又一次的质疑:Java,是否真的停滞不前了?

2024 年,从大街上随便抓一个 Java 程序员,询问其 Java 有哪些槽点,我相信你的这个下午大概是别想离开这个人的声音了 —— 从泛型不支持基本数据类型到各种各样令人抓耳挠腮的奇怪问题,你绝对可以听这个人滔滔不绝地说上一整天。那么这些问题 Java 官方知道吗?当然知道,他们在解决吗?Ummm,至少我们可以说,他们一直以来都正在积极的为解决这些问题而努力,并且有些槽点,其实早已在最新版本的 Java 中被解决。

因此,本篇文章的目的,便是带领读者从过去走向现在,再走向未来,回顾并前瞻 Java 已经推出,或是即将推出的全新特性,这些特性再 Java 的历史中都扮演着决定性的作用,为 Java“赶 Go 超 Rust”贡献着自己的努力。

碍于篇幅所限,我们将只重点提及几个 Java 语言史上的重大改动,而其他小的(但不代表不重要)更新,我们姑且一概掠过。若要了解Java 从过去到现在全部的特性更新,也许你可以看看 OpenJDK 的 Java 特性提案索引页 JEP 0: JEP Index,了解更多。

Java8:Lambda 表达式和 Stream API Java 8 无论是从 JVM 层面的变动,还是 Java 语法和标准库的变动,都可以说是 Java 有史以来第一次大规模的增补,毋庸置疑的,这次更新也为 Java 带来了第二春,使之焕发新生,而其长达近 20 年的 LTS 支持,也使其成为了 Java 历史上使用率最高,最经久不衰的 Java 版本。

在这次更新中,Java 自然是引入了全新且复杂的 Date & Time API,看起来好像有点用但实际上很鸡肋的 Optional API 这类谈不上小但是也很难说重大的标准库修补。但是更为被人津津乐道,且在本人看来是 Java 8 最重要的两个更新,便是 Lambda 表达式和 Stream API。

Lambda 表达式 也许是考虑到兼容性,也许就是纯粹 Java 开发者懒,自 Java 7 以前,Java 虚拟机(JVM)基本没有什么重大改动,纵然 Java 语言已经引入了诸如自动拆装箱、参数化类型(泛型)这样的重大语言特性,JVM 依然不动如山,全靠 javac 衬托。

然而到了 Java 7,天塌了。JVM 引入了一个全新的指令 invokedynamic,其可以在运行时动态的分派一个函数调用,这个指令最初并没有被 Java 语言本身所使用,相反,它的出现是为了解决基于 JVM 的动态类型语言(例如 Groovy)在运行时由于 JVM 无法支持函数类型动态分派而导致的巨大性能问题。

而这个指令第一次在 Java 语言中登场,便是神奇的 Lambda 表达式了。

即使你不知道 Lambda 表达式,或者他背后的函数式接口,我相信你一定写过这样的代码:

new Thread(() -> Foo.bar()).start(); // 更好的一个写法其实是 new Thread(Foo::bar).start(); 这很自然,就像你可能不会泛型编程,但一定也用过带泛型的 Java 容器一样。