You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Stream.distinct()会选择重复元素中的哪一个实例?

Stream.distinct() 会保留重复元素中的哪一个实例?

结论:Stream.distinct() 会保留流中第一个出现的重复元素实例,后续相等的实例都会被丢弃

在你的场景中,三个personId=1的Tim实例里,第一个仅包含宠物Brix的实例是最先出现在peopleList中的,因此distinct()会保留它,后面两个包含更多宠物的Tim实例因与第一个实例通过equals()判定为相等,被直接过滤掉。

原理说明

distinct()的核心逻辑是在遍历流元素时维护一个内部Set集合:

  • 处理每个元素时,先检查该元素是否已存在于Set中
  • 若不存在,则将其加入Set并保留到结果流中
  • 若已存在,则跳过该元素

因为你的源集合是ArrayList(有序集合),对应的流是有序流,distinct()会严格遵循遍历顺序保留第一个出现的相等元素。如果是无序流(比如来自HashSet的流),保留的实例则无法确定,但有序流下这个规则是明确的。

另外需要注意:你的Person类仅通过personId实现equals()和hashCode(),这导致三个Tim实例被判定为相等,才触发了distinct()的去重行为。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:30:41