2019 年及以后的 Java

2025-05-25

2019 年及以后的 Java

当您听到Java这个词时您会想到什么

对于某些人来说,他们记得在计算机科学课上学到的一种非常冗长的编程语言,而对于另一些人来说,他们可能因为它的流行度而听说过它。

有些人...就是讨厌 Java。

其中,Java 至今仍是最受欢迎的语言之一,为什么呢?

你所了解的 Java

很多人在编程初期学习过 Java,有些人后来喜欢上了它,而有些人则讨厌它。

不幸的是,人们用多年前学过的 Java 来评判现代 Java。

他引用 Venkat Subramanian 的话说道:“与过去 20 年相比,Java 的开发在过去 5 年中取得了迄今为止最好的成绩,我敢打赌,未来 3 到 4 年,Java 领域的发展将达到前所未有的水平。”

我会尝试向您展示 Java 已经改进的一些领域,尽管 Java 的改进远远超出了我在这里展示的范围。

让我们举一些例子,在这个例子中,我将使用您可能知道的旧 Java,然后我将向您展示如何使用现代 Java解决问题。

假设你的讲师让你创建一个程序来创建从 1 到 10 的整数列表,然后循环打印出偶数,使用旧的 Java 你的代码可能看起来像这样:

      ArrayList<Integer> myList = new ArrayList<Integer>();

        for (int i = 1; i <= 10; i++) {
            myList.add(i);
        }

        for (int num : myList) {
            if (num % 2 == 0)
                System.out.println(num);
        }
Enter fullscreen mode Exit fullscreen mode

如果您使用过其他语言,那么上面的代码可能会让您想要一个更简单、更不复杂的解决方案。

使用现代 Java,我可以使用以下样式编写上述代码,使其更容易阅读:

      rangeClosed(1, 10).boxed().collect(Collectors.toList())
                .stream()
                .filter(integer -> integer % 2 == 0)
                .forEach(System.out::println);
Enter fullscreen mode Exit fullscreen mode

我认为这样更好看。

众所周知,Java 是一种必须先声明每个细节才能完成小事的语言,因此使用您知道的 Java,创建 Hashmap 看起来就像这样:

HashMap<Integer, String> myMap = new HashMap<Integer, String>();
Enter fullscreen mode Exit fullscreen mode

嗯,我希望它更简洁一些。

幸运的是,Java 目前不需要所有这些样板代码:

var myMap = new HashMap<Integer, String>();
Enter fullscreen mode Exit fullscreen mode

我在这里并不是要说服你 Java 是最简洁的语言,而是要告诉你,Java 可能比你上次遇到的语言简洁得多,而且更加简洁。

现代 Java

我将列出 Java 中的一些改进,请注意,这绝不是一个详尽的列表,而且还有比我在这里提到的更多的改进。

如果我尝试提及所有改进,那么我将有足够的内容来出版一本相关书籍。

JShell

Java Shell 工具(JShell)是一个用于学习 Java 编程语言和原型 Java 代码的交互式工具。

JShell 是一个“读取-求值-打印”循环 (REPL),它会在输入声明、语句和表达式时对其进行求值,并立即显示结果。该工具可从命令行运行。

JShell

您可以测试单个语句、尝试方法的不同变体,并在 JShell 会话中试验不熟悉的 API。

它是在 JDK 9 中添加的,它是一个非常有用的工具,将来可能会成为救星。

Switch 表达式

Switch 表达式预计将出现在 JDK 12+ 中,它们简化了我们所知的传统 switch 语句,例如代码:

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
Enter fullscreen mode Exit fullscreen mode

可以写为:

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
Enter fullscreen mode Exit fullscreen mode

CompletableFuture(Java 的承诺)

CompletableFuture 允许创建和执行异步任务链。

CompletableFuture 的工作方式与 JavaScript 中的 Promises 的工作方式相同。

    public static void main(String[] args) throws InterruptedException {

        CompletableFuture.supplyAsync(() -> longProcess()).thenAccept(System.out::println);
        Thread.sleep(4000);
        System.out.println("Done!");
    }

    private static int longProcess() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 1;
    }
Enter fullscreen mode Exit fullscreen mode

CompletableFuture 是在 JDK 8 中引入的,但人们只关注闪亮的全新 Java 流而没有注意到这个奇妙的工具。

如果你有兴趣,可以去观看并了解一下:

Loom 项目

尚未完全实现的 Project Loom 将引入由 Java 虚拟机管理的轻量级、高效线程 Fiber,让开发人员使用相同的简单抽象,但具有更好的性能和更低的占用空间。

就内存占用而言,纤程比内核线程轻量得多,并且它们之间的任务切换开销接近于零。

单个 JVM 实例中可以生成数百万条纤程,程序员无需犹豫发出同步阻塞调用,因为阻塞实际上是免费的。

记录(Java 的数据类)

记录(Records)也是一个尚未实现的功能,它将使创建 POJO 类更加容易。例如,如下类:

class Point {
    double x;
    double y;

    Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getX() {
        return x;
    }

    public void setY(double y) {
        this.y = y;
    }

    public double getY() {
        return y;
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }


    @Override
    public String toString() {
        return super.toString();
    }
}

Enter fullscreen mode Exit fullscreen mode

将被重写为:

record Point(double x, double y);
Enter fullscreen mode Exit fullscreen mode

Java 还有一些其他非常有趣的特性,我留给您去好奇去发现。

发布周期

最近,Java 宣布将采用每 6 个月发布一次的发布周期,因此我们预计每 6 个月就会发布一次。好消息是,您可以更快地获得新功能。

Android 上的 Java

谷歌宣布 Kotlin 成为官方语言,自此之后,它取得了巨大的发展。

我确实喜欢 Kotlin,我也使用 Kotlin,但我认为 Kotlin 不会取代 Java。

现在,你可能听到过一些 Android 开发者抱怨 Java。我通常希望他们能具体一点。

他们实际上抱怨的是Java 7的冗长,而撰写本文时最新发布的是Java 12

Kotlin 在 Android 上看起来很酷,部分原因是 Android 开发人员无法访问最新的 Java 功能并且只能使用Java 7 ~ Java 8

尽管如此,大多数 Android 应用程序目前仍然是用 Java 编写的。很多专业开发人员可能已经习惯使用 Java 7 了 :)

我们不应该犯这样的错误:将KotlinJava进行比较,就像将Swift与Objective C进行比较一样

不幸的是,许多 Android 开发人员并没有意识到 Java 作为一种语言已经发展到了何种程度,因为他们仍然使用 CS 类的 Java。

顺便说一句,我是一名 Android 开发人员,我也认为 Kotlin 很酷 ;)

Java 仍然免费

Oracle 最近宣布将对 Oracle JDK 的商业使用和长期支持收费。这件事上了新闻头条,人们也因此撰写了大量与事实不符的文章。

致相关人士,Java 仍然是免费的。

大多数使用 Oracle JDK 进行开发的大公司不会对这一变化感到困扰。

对于那些担心的人来说,没有必要!

从 JDK 11 开始,OpenJDK 的功能与 Oracle 的 JDK 相同。因此,它们可以互换。

此外,亚马逊最近宣布推出Amazon Corretto,它是开放 Java 开发工具包 (OpenJDK) 的免费、多平台、可立即投入生产的发行版。

Corretto 提供长期支持,包括性能增强和安全修复。

您也可以选择其他 OpenJDK 提供商,例如 AdoptOpenJDK,实际上没有必要担心。

Java 仍然是免费的。

Java 目前的语言排名

目前,Java在 TIOBE 编程语言排行榜上排名第一,在 GitHub 的State of the Octoverse中也排名第二

这不是推销

这篇文章并非劝你辞掉工作去学习 Java。相反,我在这里想告诉你 Java 已经走了多远,以及它作为一种语言的未来发展方向。

Java 的持续适应能力帮助它在很长一段时间内保持顶级语言之一的地位。

文章来源:https://dev.to/lemuelogbunude/java-in-2019-and-beyond-1hah
PREV
CSS 高度全页 CSS 陷阱:如何使用 div 填充页面?
NEXT
Web 开发者的实用工具