疑问
今天想到了一个问题,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,就抛异常了
addAll
add