-
Java Stream teeing 会把同一批元素交给两个下游收集器,再合并为一个结果。本文用订单统计、Optional 空结果和 groupingBy 分组案例说明适用场景与边界。
-
Java Stream 使用 groupingBy 分组时,默认结果 Map 的键顺序不能作为业务依据。通过 groupingBy 的 mapFactory 传入 LinkedHashMap::new,可以让分组键按首次出现顺序迭代,同时在有序输入和 toList 下保留每组元素顺序。本文还说明并行流、TreeMap 与排序的选择边界。
-
Java 模块系统中,exports 解决模块间公开类型的普通访问,opens 解决运行时深反射。本文用 module-info.java 和命令行参数对比两者边界,并说明如何用 to 限定目标模块。
-
ServiceLoader找不到provider时,先核对META-INF/services文件或module-info.java声明,再检查类加载器、可见性和无参构造器。本文给出一套可复用的配置与排查方法。
-
Java NIO 中 ByteBuffer.flip() 会把当前 position 变成 limit,再把 position 归零,适合把写入态切换为读取态。本文用状态表、代码和边界示意说明 flip 怎么配置,以及如何排查读不到数据、下溢和多轮读写问题。
-
Java ServiceLoader 在模块路径下找不到 provider,通常不是接口实现消失,而是 uses、provides、模块路径或 provider 实例化条件没有同时满足。本文用最小模块示例拆开排查。
-
围绕 Java 21 pattern switch 和 sealed 类型,说明 permitted 分支覆盖、when 守卫、无守卫兜底、支配关系与 null 边界的实现方法。
-
Java CompletableFuture 使用 whenComplete 记录成功值和异常时,如何保持上游结果语义?本文用代码和边界表说明观察、异常传播及验证方法。
-
CompletableFuture.allOf 返回的是 CompletableFuture,它只负责等待全部任务完成。保留每个子任务的 CompletableFuture,再逐项 join,就能按原顺序收集类型安全的返回值。
-
Java Semaphore 不会自动校验 release 的许可数量。本文用许可守恒、日志计数和最小并发测试定位多释放、少释放以及中断路径造成的并发泄漏。
-
Java 的默认 Locale 会影响未显式指定区域设置的数字、日期和字符串格式化。本文说明 FORMAT Locale 的作用、常见不稳定场景,以及如何用显式 Locale 区分展示文本和机器协议。
-
Java StructuredTaskScope 失败时,joiner 如何取消未完成子任务,FailedException、isCancelled 和 close 又分别说明什么?本文用 Java 25 预览 API 示例拆开传播链与关闭边界。
-
Java AsynchronousFileChannel 的 write 是异步提交,写入完成前关闭通道会让未完成操作以 AsynchronousCloseException 失败。本文用回调和 Future 两种方式说明正确的关闭时机。
-
Java HttpClient 使用 BodyHandlers.ofPublisher() 时,响应体 Publisher 只能订阅一次;本文用 Flow.Subscriber 说明 request、cancel、回调和连接复用边界。
-
Java 21 虚拟线程出现 pinning 时,先用 JFR 或 jdk.tracePinnedThreads 定位持锁阻塞,再把频繁且可能长时间等待的 I/O 移出 synchronized;短时内存临界区不必盲目改写。