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

文章介绍了如何在Java中使用StreamAPI来保留数组或列表中的重复元素。对于基本类型数组,通过创建HashSet并利用其add方法的返回值来过滤出重复的Integer。对于对象数组,特别是包含特定属性相同的情况,文章展示了利用groupingBy进行分组,然后找出分组后大小超过1的集合,从而获取重复的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

我们已经非常熟悉了,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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值