美文网首页
Java8 Stream distinct 保留前面的还是后面的

Java8 Stream distinct 保留前面的还是后面的

作者: Yellowtail | 来源:发表于2019-02-13 14:42 被阅读0次

    疑问

    今天想到了一个问题,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 保留的是 出现的第一份数据

    扩展

    list1list2 的初始化方法不一样
    list1 是直接 Arrays.asList
    list2new 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

    相关文章

      网友评论

          本文标题:Java8 Stream distinct 保留前面的还是后面的

          本文链接:https://www.haomeiwen.com/subject/caqdeqtx.html