Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions html-generators/locales.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ en=English
de=Deutsch
es=Español
pt-BR=Português (Brasil)
zh-CN=中文 (简体)
ar=العربية
fr=Français
ja=日本語
18 changes: 18 additions & 0 deletions translations/content/zh-CN/collections/collectors-teeing.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: Collectors.teeing()
oldApproach: 两次遍历
modernApproach: teeing()
summary: "在单次流遍历中计算两个聚合结果。"
explanation: "Collectors.teeing() 将每个元素发送到两个下游收集器,然后将结果合并。不再需要对流进行两次遍历或将中间结果存储在可变变量中。"
whyModernWins:
- icon: ⚡
title: 单次遍历
desc: "只处理流一次,而非两次。"
- icon: 🧹
title: 无可变状态
desc: "无需用于收集中间结果的临时变量。"
- icon: 🧩
title: 可组合
desc: "可与其他收集器组合作为下游收集器。"
support:
description: 自 JDK 12 起广泛可用(2019 年 3 月)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 不可变地复制集合
oldApproach: 手动复制 + 包装
modernApproach: List.copyOf()
summary: "一次调用创建任何集合的不可变副本。"
explanation: "List.copyOf()、Set.copyOf() 和 Map.copyOf() 创建不可变快照。如果源集合已经是不可变的,则跳过复制——这一实现细节对调用者透明。"
whyModernWins:
- icon: ⚡
title: 智能复制
desc: "如果源已经是不可变的,则跳过复制。"
- icon: 🔒
title: 真正不可变
desc: "结果集合结构上不可修改。"
- icon: 📏
title: 简洁
desc: "一行代码替代多行手动复制和包装。"
support:
description: 自 JDK 10 起广泛可用(2018 年 3 月)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 创建不可变列表
oldApproach: 冗长的包装方式
modernApproach: List.of()
summary: "用一个简洁的表达式创建不可变列表。"
explanation: "List.of() 创建真正不可变的列表——无需包装,无需防御性复制。它拒绝 null 元素,在结构上不可变。旧方式需要三层嵌套调用。"
whyModernWins:
- icon: 📏
title: 一次调用
desc: "用单个工厂方法替代三层嵌套调用。"
- icon: 🔒
title: 真正不可变
desc: "不只是包装器——列表本身是不可变的。"
- icon: 🛡️
title: null 安全
desc: "在创建时拒绝 null 元素,快速失败。"
support:
description: 自 JDK 9 起广泛可用(2017 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/collections/immutable-map-creation.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 创建不可变 Map
oldApproach: Map 构建器模式
modernApproach: Map.of()
summary: "无需构建器即可内联创建不可变 Map。"
explanation: "Map.of() 内联接受键值对并返回不可变 Map。Map.ofEntries() 处理超过 10 个条目的情况。旧方式需要可变的临时 Map 和 Collections.unmodifiableMap()。"
whyModernWins:
- icon: 📏
title: 内联创建
desc: "无需临时可变 Map。"
- icon: 🔒
title: 真正不可变
desc: "Map 本身不可修改,不只是视图。"
- icon: 🛡️
title: null 安全
desc: "键和值均拒绝 null,快速失败。"
support:
description: 自 JDK 9 起广泛可用(2017 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/collections/immutable-set-creation.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 创建不可变 Set
oldApproach: 冗长的包装方式
modernApproach: Set.of()
summary: "用单个工厂调用创建不可变 Set。"
explanation: "Set.of() 创建真正不可变的 Set,拒绝 null 和重复元素。迭代顺序不保证——如果需要顺序,使用 LinkedHashSet 或 List.of()。"
whyModernWins:
- icon: 📏
title: 简洁
desc: "一行代码替代三层嵌套调用。"
- icon: 🔒
title: 真正不可变
desc: "Set 本身不可修改。"
- icon: 🛡️
title: null 安全
desc: "在创建时拒绝 null 元素。"
support:
description: 自 JDK 9 起广泛可用(2017 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/collections/map-entry-factory.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: Map.entry() 工厂方法
oldApproach: SimpleEntry
modernApproach: Map.entry()
summary: "使用简洁的工厂方法创建 Map 条目。"
explanation: "Map.entry() 替代冗长的 AbstractMap.SimpleEntry 构造函数。结果条目是不可变的——键和值均不能更改。"
whyModernWins:
- icon: 📏
title: 简洁
desc: "一行代码,意图更清晰。"
- icon: 🔒
title: 不可变
desc: "条目创建后无法修改。"
- icon: 🎯
title: 语义清晰
desc: "Map.entry() 准确表达您的意图。"
support:
description: 自 JDK 9 起广泛可用(2017 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/collections/reverse-list-iteration.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 反向列表迭代
oldApproach: 手动 ListIterator
modernApproach: reversed()
summary: "使用简洁的 for-each 循环以相反顺序迭代列表。"
explanation: "SequencedCollection 中的 reversed() 方法返回一个反向排序的视图,不进行复制。这与 for-each 循环完美配合,无需 ListIterator 样板。"
whyModernWins:
- icon: 📖
title: 自然语法
desc: "增强 for 循环,而非冗长的 ListIterator。"
- icon: 🔒
title: 无复制
desc: "reversed() 是视图,不复制列表。"
- icon: 📏
title: 更少代码
desc: "六行 ListIterator 样板变为一行。"
support:
description: 自 JDK 21 LTS 起广泛可用(2023 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/collections/sequenced-collections.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 有序集合
oldApproach: 索引运算
modernApproach: getFirst/getLast
summary: "使用简洁的 API 方法访问第一个/最后一个元素和反向视图。"
explanation: "SequencedCollection 添加了 getFirst()、getLast()、reversed()、addFirst()、addLast() 和 removeFirst()/removeLast()。这些方法统一了 List、Deque 和 LinkedHashSet 的 API。"
whyModernWins:
- icon: 📖
title: 自我描述
desc: "getLast() 比 get(size()-1) 更清晰。"
- icon: 🔗
title: 统一 API
desc: "List、Deque 和 LinkedHashSet 共享相同的有序操作。"
- icon: 🔒
title: 反向视图
desc: "reversed() 返回视图,不复制集合。"
support:
description: 自 JDK 21 LTS 起广泛可用(2023 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/collections/stream-toarray-typed.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 类型化流 toArray
oldApproach: 手动数组复制
modernApproach: toArray(generator)
summary: "使用方法引用将流转换为类型化数组。"
explanation: "toArray(IntFunction) 方法从流创建正确类型化的数组。传递 String[]::new 获取 String[],而非 Object[]。"
whyModernWins:
- icon: 🎯
title: 类型安全
desc: "没有 Object[] 转换——数组类型是正确的。"
- icon: 📏
title: 简洁
desc: "方法引用语法简洁而具有表达力。"
- icon: 🚫
title: 无 System.arraycopy
desc: "不需要中间 Object[] 和数组复制。"
support:
description: 自 JDK 8 起广泛可用(2014 年 3 月)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 不可修改收集器
oldApproach: collectingAndThen
modernApproach: stream.toList()
summary: "使用 stream.toList() 直接收集到不可修改列表。"
explanation: "Java 10 添加了 toUnmodifiableList()、toUnmodifiableSet() 和 toUnmodifiableMap()。Java 16 的 stream.toList() 更进一步,完全不需要 collect() 或 Collectors 导入。"
whyModernWins:
- icon: 📏
title: 最简洁
desc: "stream.toList() 完全不需要 collect() 或 Collectors 导入。"
- icon: 🔒
title: 真正不可变
desc: "结果列表在结构上不可修改。"
- icon: 🧹
title: 更少导入
desc: "无需导入 java.util.stream.Collectors。"
support:
description: 自 JDK 16 起广泛可用(2021 年 3 月)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: CompletableFuture 链式调用
oldApproach: 阻塞式 Future.get()
modernApproach: CompletableFuture
summary: "使用 CompletableFuture 链式异步操作,无需阻塞。"
explanation: "CompletableFuture 支持非阻塞异步管道。链式操作使用 thenApply、thenCompose 和 thenCombine,仅在最终结果需要时阻塞。"
whyModernWins:
- icon: 🔗
title: 可链式调用
desc: "将异步步骤组合成可读的管道。"
- icon: ⚡
title: 非阻塞
desc: "线程不会等待中间结果——只在需要时阻塞。"
- icon: 🔀
title: 可组合
desc: "使用 thenCombine、allOf、anyOf 组合多个 Future。"
support:
description: 自 JDK 8 起广泛可用(2014 年 3 月)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 使用虚拟线程进行并发 HTTP 请求
oldApproach: 线程池 + URLConnection
modernApproach: 虚拟线程 + HttpClient
summary: "使用虚拟线程和 HttpClient 并发获取多个 URL。"
explanation: "虚拟线程使每个 HTTP 请求使用一个线程变得切实可行。每个虚拟线程在等待 I/O 时会挂载,不会阻塞平台线程。"
whyModernWins:
- icon: ♾️
title: 每个请求一个线程
desc: "无需调整池大小——每个 URL 一个虚拟线程。"
- icon: 🔒
title: 简单的错误处理
desc: "每个任务在自己的线程中处理错误。"
- icon: 📏
title: 简洁代码
desc: "现代 HttpClient 与虚拟线程的语义清晰。"
support:
description: 自 JDK 21 LTS 起广泛可用(2023 年 9 月)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: ExecutorService 自动关闭
oldApproach: 手动关闭
modernApproach: try-with-resources
summary: "使用 try-with-resources 实现执行器的自动关闭。"
explanation: "自 Java 19 起,ExecutorService 实现了 AutoCloseable。close() 方法会等待所有任务完成,然后关闭执行器——无需手动 shutdown() 和 awaitTermination()。"
whyModernWins:
- icon: 🧹
title: 自动清理
desc: "当代码块退出时自动关闭。"
- icon: 🛡️
title: 不会泄漏线程
desc: "即使抛出异常,执行器也会正确关闭。"
- icon: 📏
title: 更少样板代码
desc: "无需手动 try/finally 来调用 shutdown()。"
support:
description: 自 JDK 19 起广泛可用(2022 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/concurrency/lock-free-lazy-init.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 无锁延迟初始化
oldApproach: synchronized + volatile
modernApproach: StableValue
summary: "用 StableValue 替代双重检查锁定,实现延迟单例。"
explanation: "StableValue 以正确的内存语义封装延迟初始化模式。它消除了对 volatile、synchronized 和双重 null 检查的需要。"
whyModernWins:
- icon: 🧹
title: 无样板代码
desc: "无 volatile、synchronized 或双重 null 检查。"
- icon: 🔒
title: 正确的内存语义
desc: "JVM 保证正确的可见性,无需手动内存屏障。"
- icon: 📖
title: 意图清晰
desc: "StableValue 的名称准确描述了其语义。"
support:
description: JDK 25 预览版(JEP 502,StableValue)。需要 --enable-preview。
18 changes: 18 additions & 0 deletions translations/content/zh-CN/concurrency/process-api.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 现代 Process API
oldApproach: Runtime.exec()
modernApproach: ProcessHandle
summary: "使用 ProcessHandle 检查和管理操作系统进程。"
explanation: "ProcessHandle 提供 PID、进程信息(命令、参数、启动时间)以及监控子进程的能力。ProcessBuilder 提供了对 stdin/stdout/stderr 的精细控制。"
whyModernWins:
- icon: 🔍
title: 完整信息
desc: "访问 PID、命令、参数、启动时间、CPU 使用率。"
- icon: 👶
title: 子进程管理
desc: "列出和监控子进程。"
- icon: 🔔
title: 终止回调
desc: "进程终止时获得通知。"
support:
description: 自 JDK 9 起广泛可用(2017 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/concurrency/scoped-values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 作用域值
oldApproach: ThreadLocal
modernApproach: ScopedValue
summary: "安全地跨调用栈共享数据,无 ThreadLocal 的陷阱。"
explanation: "ScopedValue 提供不可变的、可继承的、作用域受限的上下文。与 ThreadLocal 不同,它适用于虚拟线程,不会泄漏状态,在结构化并发中效果极佳。"
whyModernWins:
- icon: 🔒
title: 不可变
desc: "被调用方可以读取但永远不能修改作用域值。"
- icon: 🧵
title: 虚拟线程友好
desc: "与虚拟线程和结构化并发配合良好。"
- icon: 🧹
title: 无泄漏
desc: "作用域退出时自动清理——无需 remove()。"
support:
description: 在 JDK 25 LTS 中正式发布(JEP 506,2025 年 9 月)。
18 changes: 18 additions & 0 deletions translations/content/zh-CN/concurrency/stable-values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 稳定值
oldApproach: 双重检查锁定
modernApproach: StableValue
summary: "无需 volatile 或 synchronized 的线程安全延迟初始化。"
explanation: "StableValue 提供内置线程安全的延迟初始化不可变值。JVM 知道该值只写入一次,可以进行更激进的优化,包括常量折叠。"
whyModernWins:
- icon: 🧹
title: 零样板代码
desc: "无 volatile、synchronized 或 null 检查。"
- icon: ⚡
title: JVM 优化
desc: "JVM 可以将稳定值常量折叠,就像 final 字段一样。"
- icon: 🔒
title: 线程安全
desc: "保证只初始化一次,不存在竞态条件。"
support:
description: JDK 25 预览版(JEP 502)。需要 --enable-preview。
18 changes: 18 additions & 0 deletions translations/content/zh-CN/concurrency/structured-concurrency.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 结构化并发
oldApproach: 手动线程生命周期管理
modernApproach: StructuredTaskScope
summary: "将并发任务的生命周期作为单个工作单元管理。"
explanation: "结构化并发将一组并发任务视为一个操作。如果任何任务失败,其他任务会被取消。所有分支任务在作用域关闭前完成。"
whyModernWins:
- icon: 🛡️
title: 无线程泄漏
desc: "所有分支任务在作用域关闭前完成。"
- icon: 🔗
title: 错误传播
desc: "任何任务失败时取消其他任务。"
- icon: 📖
title: 可读结构
desc: "并发边界在代码结构中清晰可见。"
support:
description: JDK 25 预览版(第五次预览,JEP 505)。需要 --enable-preview。
18 changes: 18 additions & 0 deletions translations/content/zh-CN/concurrency/thread-sleep-duration.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 使用 Duration 的 Thread.sleep
oldApproach: 毫秒
modernApproach: Duration
summary: "使用 Duration 表达自文档化的时间值。"
explanation: "Thread.sleep(Duration) 使时间单位明确。不再需要猜测数字是毫秒、秒还是纳秒——Duration.ofSeconds(5) 一目了然。"
whyModernWins:
- icon: 📖
title: 自我描述
desc: "Duration.ofSeconds(5) 无歧义。"
- icon: 🛡️
title: 无单位混淆
desc: "不可能意外地将秒传递给期望毫秒的方法。"
- icon: 🔧
title: 可组合
desc: "Duration 与其他 java.time API 无缝配合。"
support:
description: 自 JDK 19 起广泛可用(2022 年 9 月)
18 changes: 18 additions & 0 deletions translations/content/zh-CN/concurrency/virtual-threads.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
title: 虚拟线程
oldApproach: 平台线程
modernApproach: 虚拟线程
summary: "创建数百万个轻量级虚拟线程,而非沉重的操作系统线程。"
explanation: "虚拟线程是由 JVM 而非操作系统管理的轻量级线程。它们挂起时不会阻塞平台线程,使每个请求一个线程的风格变得可行。"
whyModernWins:
- icon:
title: 轻量级
desc: "虚拟线程使用 KB 内存,平台线程使用 MB。"
- icon: ♾️
title: 可扩展
desc: "每个请求运行一个线程,无需异步代码。"
- icon: 🔧
title: 无需重构
desc: "与现有阻塞 API(JDBC、文件 I/O)配合使用。"
support:
description: 自 JDK 21 LTS 起广泛可用(2023 年 9 月)
Loading