在Stream中sorted()后调用distinct()与直接调用distinct()结果是否不同?
问题原因分析
你看到的结果差异,核心在于Stream中distinct()和sorted()的执行顺序会直接影响最终输出,具体拆解如下:
1. distinct()的核心逻辑
distinct()会过滤掉流中重复的元素,但它遵循「保留元素在流中首次出现的实例」规则,后续出现的重复元素都会被剔除。
你的list3是list1和list2拼接后的结果,原始元素顺序为:
["aaaaa", "b", "lll", "kkk", "kkk", "h", "kkk", "mmmm"]
调用distinct()后,最终保留的元素是:
["aaaaa", "b", "lll", "kkk", "h", "mmmm"]
2. 两种流处理的差异对比
第一种处理:distinct() → sorted()
先对原始流去重,得到上面的去重列表,再按字符串长度排序。排序后元素顺序变为:
b(长度1)、h(长度1)、lll(长度3)、kkk(长度3)、mmmm(长度4)、aaaaa(长度5)
这就是第一组输出的内容。
第二种处理:直接调用distinct()
去重后直接按照原始流中元素首次出现的顺序输出,也就是:
aaaaa、b、lll、kkk、h、mmmm
和第一组的排序后顺序自然不同。
补充:如果调换执行顺序(sorted() → distinct())
如果先执行排序再去重,结果也会和直接去重有差异。比如排序后所有kkk会被集中排列,distinct()依然只保留第一个kkk,但此时整个流的元素已经是按长度排序后的状态,最终输出的顺序会和「先去重再排序」一致,但如果是其他包含重复元素的复杂场景,排序后再去重可能会改变distinct()保留的元素实例(比如原流中多个重复元素的属性有差异,但equals判断为重复的情况)。
内容的提问来源于stack exchange,提问作者MOHIT KAUSHIK
相关产品推荐
相关产品推荐

