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
相关产品推荐
相关产品推荐

