news 2026/5/1 6:10:19

277. Java Stream API - 去重与排序:Stream 中的 distinct() 与 sorted()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
277. Java Stream API - 去重与排序:Stream 中的 distinct() 与 sorted()

文章目录

  • 277. Java Stream API - 去重与排序:Stream 中的 `distinct()` 与 `sorted()`
      • 🎯 目标
    • 🧼 `distinct()` —— 去重利器
      • 📌 定义:
      • 🔍 `distinct()` 的内部原理
      • ✅ 示例:整数去重
      • 🔽 输出:
    • 📊 `sorted()` —— 排序操作
      • 📌 定义:
      • 🧠 工作机制:
      • ✅ 示例 1:自然排序(String 实现了 Comparable)
      • 🔽 输出:
      • ✅ 示例 2:按长度排序(使用 Comparator)
      • 🔽 输出:
    • 🔁 无限流中的表现对比
      • ✅ `distinct()` 适用于无限流
        • 示例:
      • 🔽 输出:
      • ❌ `sorted()` 不适用于无限流
        • 示例(反例):
      • ⚠️ 输出:
    • ✅ 总结对比
    • 🧠 延伸小技巧
      • 🧩 想去重自定义对象?

277. Java Stream API - 去重与排序:Stream 中的distinct()sorted()


🎯 目标

本节将讲解如何使用distinct()去除重复值,使用sorted()对流元素排序,包括:

  • 它们的工作机制
  • 使用示例
  • 注意事项(如可用于无限流与否)
  • 性能影响

🧼distinct()—— 去重利器

📌 定义:

distinct()会移除流中重复的元素,依据是元素的:

  • hashCode()
  • equals()

所以:你使用的对象必须正确实现这两个方法,才能保证去重有效。


🔍distinct()的内部原理

distinct()并不像大多数中间操作那样是“无状态”的:

  • 内部维护一个Set集合来追踪已见过的元素。
  • 每处理一个元素,会尝试把它加入Set
    • ✅ 加入成功:表示是第一次出现,传递下游。
    • ❌ 加入失败:说明是重复的,直接丢弃。

⚠️ 因为要维护状态,所以它会占用内存,但能即时输出结果。


✅ 示例:整数去重

List<Integer>ints=List.of(1,4,2,1,3,3);List<Integer>distincts=ints.stream().distinct().toList();System.out.println("distinct ints: "+distincts);

🔽 输出:

distinct ints:[1,4,2,3]

✅ 说明:重复的13被移除了,且保持原始顺序。


📊sorted()—— 排序操作

📌 定义:

sorted()用于将流中的元素排序。

它有两个重载:

Stream<T>sorted();// 自然顺序(元素必须实现 Comparable)Stream<T>sorted(Comparator<?superT>c);// 自定义顺序

🧠 工作机制:

  • sorted()是有状态的中间操作。
  • 必须读取所有元素后再排序输出
  • 所以它不适用于无限流,会导致挂起或卡死。

✅ 示例 1:自然排序(String 实现了 Comparable)

List<String>strings=List.of("one","two","three","four");List<String>naturalSort=strings.stream().sorted().toList();System.out.println("natural sort: "+naturalSort);

🔽 输出:

natural sort:[four,one,three,two]

👉 字符串按照字典序排序。


✅ 示例 2:按长度排序(使用 Comparator)

List<String>shortestFirst=strings.stream().sorted(Comparator.comparingInt(String::length)).toList();System.out.println("shortest first: "+shortestFirst);

🔽 输出:

shortest first:[one,two,four,three]

👉 按字符串长度升序排序。


🔁 无限流中的表现对比

distinct()适用于无限流

可以边处理边输出,只要有足够的终止条件(如limit()),就不会卡死。

示例:
varints=IntStream.iterate(0,i->i+1).map(i->i/3).distinct().limit(5).toArray();System.out.println("ints = "+Arrays.toString(ints));

🔽 输出:

ints=[0,1,2,3,4]

🌟 它发现新值就会推送给下游,表现非常高效!


sorted()不适用于无限流

因为它必须先收集所有元素再排序,所以当流无限时,它永远等不到结束,程序会卡死或耗尽内存。

示例(反例):
int[]ints=IntStream.iterate(0,i->i+1).map(i->i/3).sorted().limit(5).toArray();System.out.println("ints = "+Arrays.toString(ints));

⚠️ 输出:

<程序将无限等待,永远没有结果>

✅ 总结对比

方法是否有状态是否可用于无限流内部机制
distinct()有状态✅ 支持使用Set去重
sorted()有状态❌ 不支持使用缓冲区收集+排序

🧠 延伸小技巧

🧩 想去重自定义对象?

你的类必须实现正确的:

  • equals()
  • hashCode()

示例:

recordUser(Stringname,intage){}List<User>users=...;users.stream().distinct().toList();// 正常去重

如用的是Comparator排序:

users.stream().sorted(Comparator.comparing(User::age)).toList();
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 20:01:35

【Matlab】matlab代码实现三维海面建模

下面是一段用MATLAB实现三维海面建模的示例代码。这段代码使用了meshgrid函数生成了一个网格&#xff0c;并在该网格上使用正弦函数来模拟海面波动。请注意&#xff0c;这只是一个简单的示例&#xff0c;实际的海面建模可能会更加复杂。% 定义网格范围和步长 x -10:0.5:10; y …

作者头像 李华
网站建设 2026/5/1 6:10:17

Miniconda镜像内嵌Jupyter的三大优势分析

Miniconda镜像内嵌Jupyter的三大优势分析 在人工智能实验室里&#xff0c;最让人头疼的往往不是模型调参失败&#xff0c;而是“我本地能跑通&#xff0c;怎么到服务器就报错了&#xff1f;”——这种因环境不一致导致的问题几乎困扰过每一位数据科学从业者。更常见的情况是&am…

作者头像 李华
网站建设 2026/4/22 23:48:32

GPT-Crawler实战指南:三步构建专属AI知识库

GPT-Crawler实战指南&#xff1a;三步构建专属AI知识库 【免费下载链接】gpt-crawler Crawl a site to generate knowledge files to create your own custom GPT from a URL 项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-crawler 还在为海量网站资料整理而烦…

作者头像 李华
网站建设 2026/4/20 20:38:42

深度剖析MOSFET工作原理:线性区与饱和区区别

深度拆解MOSFET&#xff1a;线性区与饱和区的本质区别&#xff0c;不只是“夹断”那么简单你有没有遇到过这种情况&#xff1f;设计一个开关电源&#xff0c;MOSFET发热严重&#xff0c;效率上不去——查来查去发现管子没完全导通&#xff1b;或者搭了个共源放大电路&#xff0…

作者头像 李华
网站建设 2026/4/23 13:38:39

手把手教程:模拟电子技术放大电路分析从零实现

从零开始搞懂放大电路&#xff1a;一个工程师的实战笔记你有没有过这样的经历&#xff1f;手握万用表&#xff0c;面前是面包板上一堆电阻、电容和三极管&#xff0c;心里却没底——这电路到底能不能放大信号&#xff1f;为什么输出波形一加信号就削顶&#xff1f;静态工作点调…

作者头像 李华
网站建设 2026/4/16 18:50:55

SkyReels-V2无限长度视频生成:零基础快速上手全攻略

SkyReels-V2无限长度视频生成&#xff1a;零基础快速上手全攻略 【免费下载链接】SkyReels-V2 SkyReels-V2: Infinite-length Film Generative model 项目地址: https://gitcode.com/GitHub_Trending/sk/SkyReels-V2 想要用AI轻松创作专业级视频内容吗&#xff1f;SkyRe…

作者头像 李华