跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java Stream API 排序流特性与用法

Java Stream API 中的排序流具有 SORTED 特性,可通过有序源如 TreeSet 或调用 sorted() 方法创建。了解流是否已排序有助于优化并行处理效率。中间操作如 map() 和 flatMap() 会移除 SORTED 特性,而 filter() 通常保留。通过 Spliterator 的 characteristics() 可检测流的排序状态。掌握这些特性有助于编写高效流操作,避免不必要的性能开销。

墨染流年发布于 2026/3/15更新于 2026/9/1164 浏览
Java Stream API 排序流特性与用法

Java Stream API 排序流特性与用法

在 Java 中,SORTED 流表示元素已经按某种规则排序。这些流可以通过两种方式创建:

  1. 排序的源:例如 TreeSet,它自然保持元素的顺序。
  2. 调用 sorted() 方法:该方法可以将流中的元素按自然顺序或自定义的比较器进行排序。

知道流是已排序的,可以帮助流的实现做一些优化。例如,当流已经是排序好的时,流的实现可以跳过再次排序的步骤,从而提高效率。然而,流的排序特性并非在所有情况下都能被优化。因为有时候,如果使用不同的比较器对流进行排序,排序特性可能会丧失。

SORTED 特性的清除

某些中间操作会移除流的 SORTED 特性。例如,当你使用 map() 或 flatMap() 等操作时,即使流之前是排序过的,结果流将不再被视为 SORTED 流。

示例:检查流的排序特性

你可以通过 Spliterator 接口中的 characteristics() 方法来检查流是否具有 SORTED 特性。下面是一个简单的例子,展示如何检查流的排序特性:

Predicate<Stream<?>> isSorted = stream -> ((stream.spliterator().characteristics() & Spliterator.SORTED) != 0);
List<String> strings = List.of("one", "two", "two", "three", "four", "five");
System.out.println("Is strings sorted? " + isSorted.test(strings.stream())); // false
Stream<String> sortedStrings = strings.stream().sorted();
System.out.println("Is sortedStrings sorted? " + isSorted.test(sortedStrings)); // true
Stream<String> filtered = strings.stream().sorted().filter(s -> s.length() < 5);
System.out.println("Is filtered sorted? " + isSorted.test(filtered)); // true
Stream<Integer> lengths = strings.stream().sorted().filter(s -> s.length() < 5).map(String::length);
System.out.println("Is lengths sorted? " + isSorted.test(lengths)); // false

解释

  • strings.stream() 返回的流没有排序,所以 isSorted.test(strings.stream()) 返回 false。
  • sortedStrings 是通过调用 sorted() 创建的流,它是有序的,因此 isSorted.test(sortedStrings) 返回 true。
  • filtered 流是对 sortedStrings 进行过滤后的结果,它依然保持排序特性,因为过滤操作不会影响排序。
  • lengths 流通过 map() 转换了元素(将字符串转换为其长度),这会导致移除 SORTED 特性,因此 isSorted.test(lengths) 返回 false。

排序流的创建

通过 sorted() 创建排序流

sorted() 方法可以创建一个有序的流,默认使用元素的自然顺序进行排序,也可以通过传入一个自定义的比较器来指定排序方式:

示例 1:使用自然顺序排序
Stream<String> sortedStream = Stream.of("one", "two", "three", "four").sorted();
sortedStream.forEach(System.out::println);
示例 2:使用自定义比较器进行排序
Stream<String> sortedStream = Stream.of("one", "two", "three", "four").sorted(Comparator.comparingInt(String::length)); // 按字符串长度排序
sortedStream.forEach(System.out::println);

通过 TreeSet 创建排序流

TreeSet 是一种排序的集合,它会自动根据元素的自然顺序进行排序,或者你可以提供一个自定义的比较器:

Set<String> sortedSet = new TreeSet<>(Comparator.comparingInt(String::length));
sortedSet.addAll(List.of("one", "two", "three", "four"));
sortedSet.forEach(System.out::println);

流的排序特性清除

某些操作会移除流的 SORTED 特性,特别是当你进行元素转换或映射时。例如,map() 和 flatMap() 操作都会导致排序特性丧失。

示例:排序特性丧失

Stream<String> sortedStream = Stream.of("apple", "banana", "cherry").sorted();
Stream<Integer> mappedStream = sortedStream.map(String::length); // map 操作移除了排序特性
boolean isSortedAfterMap = isSorted.test(mappedStream);
System.out.println("Is mappedStream sorted? " + isSortedAfterMap); // false

通过 map() 操作,排序特性被移除,因为 map() 可能会修改元素的顺序。

总结

  • 排序流是具有 SORTED 特性的流,它可以通过 TreeSet 等有序数据源或调用 sorted() 方法创建。
  • 一些中间操作,如 map() 或 flatMap(),会移除 SORTED 特性。
  • 知道一个流是否已排序,能够帮助我们做出更高效的并行流处理决策,特别是在需要避免不必要的排序时。

通过掌握如何使用和检查流的排序特性,可以让我们编写更加高效的流操作,避免不必要的性能开销。

目录

  1. Java Stream API 排序流特性与用法
  2. SORTED 特性的清除
  3. 示例:检查流的排序特性
  4. 解释
  5. 排序流的创建
  6. 通过 sorted() 创建排序流
  7. 示例 1:使用自然顺序排序
  8. 示例 2:使用自定义比较器进行排序
  9. 通过 TreeSet 创建排序流
  10. 流的排序特性清除
  11. 示例:排序特性丧失
  12. 总结

更多推荐文章

查看全部
  • 如何在 Windows 上本地运行 DeepSeek
  • AI 小说创作全流程指南:工具使用与原理
  • Python 编程快速入门
  • RustFS Docker 部署实战:MinIO 高性能替代方案
  • 本地跑DeepSeek:用Ollama和Chatbox搭建私密AI助手
  • PyCharm 提交项目代码到 GitHub 的方法
  • Mac Mini M4 本地 AI 模型实战:从 Ollama 到 Stable Diffusion 配置指南
  • Cursor, Kiro 与 Google Antigravity:AI 智能体如何重塑开发工作流
  • 使用 ClawdBot 快速搭建 Telegram 翻译机器人
  • 大模型技术入门与实战教程:从理论到应用
  • AgentScope Java 实战:构建 LLM 智能体与多智能体协作
  • RetinaFace 与 CurricularFace 人脸识别技术实战指南
  • GitHub Copilot Agent Skills:打造跨项目 AI 专属工具箱
  • 数据库迁移 TCO 全景账本:MySQL 替代中的隐性成本与工程化工具链实测
  • Python 字典基础与进阶用法详解
  • LangChain 基本概念与实战入门
  • Spring Boot 消息队列与异步通信实战
  • PyTorch 包命名规则解析与 CUDA 版本匹配指南
  • 前端网页开发基础教程:HTML、CSS 与 JavaScript
  • 卷积神经网络(CNN)进阶:经典架构解析与实战开发

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online