天下文章一大抄, 编程语言也是

Posted on Fri 22 November 2024 in Journal

Abstract 天下文章一大抄, 编程语言也是
Authors Walter Fan
 Category    learning note  
Status v1.0
Updated 2024-11-22
License CC-BY-NC-ND 4.0

天下文章一大抄, 编程语言也是这样, 最近在看 JDK11 以来引入的一些新特性, 总有似曾相识的感觉, 不少地方干脆就是从 Python 中抄过来的. 随着编程语言的发展, 大家相互借鉴, 你抄我, 我抄你, 挺有意思. 我反正挺高兴的, 学习成本几乎为零.

Java 在最近几个 JDK 的更新(如 JDK 17、19、21 等)中确实吸取了其他语言的设计灵感,尤其是 Python 的简洁性和易用性,增加了许多现代化特性。

1. 文本块(Text Blocks)

类似于 Python 的多行字符串(Triple-Quoted Strings)

JDK 引入版本:JDK 13(预览) -> JDK 15(正式)

功能:

  • 在 Java 中,处理多行字符串曾是个麻烦事,需要手动拼接或使用复杂的转义字符。
  • 新增的文本块特性让多行字符串更加易读,类似 Python 的 """。

示例:

Python:

query = """
SELECT *
FROM users
WHERE id = 1
"""

Java:

String query = """
    SELECT *
    FROM users
    WHERE id = 1
    """;

优点:

  • 自动处理换行。
  • 支持嵌套复杂的文本内容。

2. 记录类(Records)

类似于 Python 的数据类(Dataclasses)

JDK 引入版本:JDK 14(预览) -> JDK 16(正式)

功能:

  • 提供一种轻量级的类定义方式,用于仅包含数据的对象。
  • 自动生成构造器、equals()、hashCode() 和 toString() 方法。

示例:

Python:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

Java:

record Point(int x, int y) {}

优点:

  • 大幅减少样板代码。
  • 清晰表达“不可变数据对象”的意图。

3. 模式匹配(Pattern Matching)

类似于 Python 的结构模式匹配(Structural Pattern Matching)

JDK 引入版本:

  • instanceof 模式匹配:JDK 16
  • switch 表达式模式匹配:JDK 17 和后续版本(逐步扩展中)

功能:

  • 提升 instanceof 和 switch 的能力,支持基于类型或值的模式匹配。
  • 和 Python 的 match-case 十分类似。

示例: Python:

def process(obj):
    match obj:
        case int():
            print("It's an integer")
        case str():
            print("It's a string")
        case _:
            print("Unknown type")

Java:

void process(Object obj) {
    switch (obj) {
        case Integer i -> System.out.println("It's an integer: " + i);
        case String s -> System.out.println("It's a string: " + s);
        default -> System.out.println("Unknown type");
    }
}

优点:

  • 代码更加简洁和易读。
  • 减少了手动类型检查和强制转换的繁琐操作。

4. var 关键字

类似于 Python 的动态类型推断

JDK 引入版本:JDK 10

功能:

  • 用 var 声明变量,编译器会自动推断其类型。
  • 尽管 Java 仍是强类型语言,但这使代码风格更加简洁,类似 Python 的动态类型。

示例: Python:

x = 42
name = "Alice"

Java:

var x = 42;
var name = "Alice";

优点:

  • 减少了显式类型声明的冗余。
  • 提高代码的可读性,特别是在复杂类型声明时。

5. 增强的 switch 表达式

类似于 Python 的表达式式结构

JDK 引入版本:JDK 12(预览) -> JDK 14(正式)

功能:

  • switch 语句支持返回值。
  • 语法更简洁,支持箭头语法。

示例: Python:

def get_day_name(day):
    return {
        1: "Monday",
        2: "Tuesday",
        3: "Wednesday"
    }.get(day, "Unknown")

Java:

String getDayName(int day) {
    return switch (day) {
        case 1 -> "Monday";
        case 2 -> "Tuesday";
        case 3 -> "Wednesday";
        default -> "Unknown";
    };
}

优点:

  • 可直接返回值,减少代码行数。
  • 避免 break 的冗余操作。

6. 增强的集合 API

类似于 Python 的内置集合操作

JDK 引入版本:

  • List.of(), Set.of(), Map.of():JDK 9
  • Collectors.toUnmodifiableList():JDK 10

功能:

  • 更方便地创建和操作不可变集合。
  • 类似于 Python 的列表和字典字面量语法。

示例: Python:

fruits = ["apple", "banana", "cherry"]

Java:

List<String> fruits = List.of("apple", "banana", "cherry");

优点:

  • 简化集合初始化代码。
  • 默认创建不可变集合,提高安全性。

7. 流式 API(类似 Python 的生成器和列表推导式)

Java 的流式 API 类似于 Python 的生成器和列表推导式,能简化对集合的操作。

示例: Python:

squared = [x**2 for x in range(5) if x % 2 == 0]

Java:

List<Integer> squared = IntStream.range(0, 5)
                                  .filter(x -> x % 2 == 0)
                                  .map(x -> x * x)
                                  .boxed()
                                  .toList();

总结

特性 Python 类似特性 引入版本 优点
文本块(Text Blocks) 三引号字符串 JDK 15 多行字符串更易读
记录类(Records) 数据类(Dataclasses) JDK 16 减少样板代码,表达数据意图
模式匹配(Pattern Matching) match-case JDK 17+ 强大的类型和值匹配
var 关键字 动态类型推断 JDK 10 提高简洁性
增强的 switch 表达式 表达式式结构 JDK 14 更简洁、更强大
集合 API 列表/字典字面量 JDK 9+ 简化集合操作
流式 API 生成器、推导式 JDK 8+ 简化集合处理

Java 作为一门大龄编程语言, 依然保持着旺盛的生命力, 不断迭代更新, 始终在演进的路上. 我这样一个大龄程序员, 也始终在学习的路上, 此生也有涯, 而知也无涯, Keep Moving...


本作品采用 AI 辅助创作