Stream流实践(四):流中如何保留重复元素?(基本类型 对象)

介绍

我们已经非常熟悉了,Stream流中可以采用distinct()去除重复元素。

        Integer[] integers = new Integer[] {
    
     1, 2, 1, 3, 4, 4 };
        List<Integer> distinctSort = Arrays.stream(integers).distinct().collect(Collectors.toList());
        System.out.println(distinctSort); // 去重结果:[1, 2, 3, 4]

那么反过来思考下,如何保留重复元素呢?
例如:{ 1, 2, 1, 3, 4, 4 }
输出结果:[1,4]

基本类型数组保留重复元素

    //基本类型  list找到所有重复的int
    //利用set不可重复性保留
        Integer[] numbers = new Integer[] {
    
     1, 2, 1, 3, 4, 4 };
        Set<Integer> allItems = new HashSet<>();
        Set<Integer> duplicates = Arrays.stream(numbers)
                .filter(n -> !allItems.add(n)) //Set.add() 返回fasle 如果set已经存在元素
                .collect(Collectors.toSet());
        System.out.println(duplicates);

对象数组保留重复元素

存在一个computer对象,需要在list数组中保留osName相同的computer对象

class Computer{
    
    

	int id;

	String osName;
}
        Computer c1 = new Computer(1, "Window10");

        Computer c2 = new Computer(2, "Linux");

        Computer c3 = new Computer(3, "MacOs");

        Computer c4 = new Computer(4, "Window10");

        Computer c5 = new Computer(5, "Window10");

        List<Computer> list = new ArrayList<>();
        list.add(c1);
        list.add(c2);
        list.add(c3);
        list.add(c4);
        list.add(c5);

     
        //对象类型   找到所有value重复的list
        //基本思路:groupingBy分组,然后找到分组中个数大于1的value
        List<Computer> collect = list.stream().collect(Collectors.groupingBy(Computer::getOsName))
                .entrySet().stream().filter(e -> e.getValue().size() > 1)
                .flatMap(e -> e.getValue().stream()).collect(Collectors.toList());
        System.out.println(collect);

猜你喜欢

转载自blog.csdn.net/qq_44716086/article/details/129790712