疑问
今天想到了一个问题,Java8 Stream 的 distinct
方法在数据重复的时候,是保留第一份数据,还是最后一份数据呢?
研究了一下,于是有了这篇文章
测试代码
public static void main(String[] args) {
List<String> list1 = Arrays.asList(
"a2",
"a1",
"a3",
"a4",
"a5",
"a6"
);
ArrayList<String> list2 = new ArrayList<>(Arrays.asList(
"a6",
"a3",
"a5"
));
System.out.println(list2);
list2.addAll(list1);
System.out.println(list2);
List<String> 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
,就抛异常了
网友评论