java stream distinct_Java8 Stream distinct 保留前面的还是后面的数据

疑问

今天想到了一个问题,Java8 Stream 的 distinct 方法在数据重复的时候,是保留第一份数据,还是最后一份数据呢?

研究了一下,于是有了这篇文章

测试代码

public static void main(String[] args) {

List list1 = Arrays.asList(

"a2",

"a1",

"a3",

"a4",

"a5",

"a6"

);

ArrayList list2 = new ArrayList<>(Arrays.asList(

"a6",

"a3",

"a5"

));

System.out.println(list2);

list2.addAll(list1);

System.out.println(list2);

List list3 = list2.stream().distinct().collect(Collectors.toList());

System.out.println(list3);

}

其中 list1 数据可以认为是无序的,因为后缀是2 1 3 4 5 6

list2 的数据 也是无序的

输出结果是

[a6, a3, a5]

[a6, a3, a5, a2, a1, a3, a4, a5, a6]

[a6, a3, a5, a2, a1, a4]

结论

distinct 保留的是 出现的第一份数据

扩展

list1 和 list2 的初始化方法不一样

list1 是直接 Arrays.asList

list2 是 new ArrayList

这是因为

new ArrayList得到的是 java.util.ArrayList,这个类 实现了 add remove addAll等方法

Arrays.asList 得到的是 java.util.Arrays.ArrayList,这个类没有实现 add remove addAll等方法,

直接使用 addAll ,调用的是 AbstractList.addAll ,再调用了 AbstractList.add,就抛异常了

251bcdfa5eb9?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

addAll

251bcdfa5eb9?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

add

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值