记一次项目中的去重操作

对于list对象集合进行去重过滤数据

存在问题:从数据库中查询到了大批量的数据,只需筛选出不重复的字段数据即可
解决思路:一开始想的是使用for循环遍历集合,两次循环,第一次从头开始,内循环从尾部开始,挨个判断,字段数据重复的话就行remove()操作,但是后来发现了几个问题,首先就是数据量过大的话,时间复杂度就会上升,不利于项目的运行,其次就是remove()方法,是针对于list集合中的下标进行原集合的改动,在remove掉以后有可能会出现数组越界的情况发生,不推荐使用。
解决问题:这里使用java8中提供的方法stream流来对list进行遍历操作,java8中提供了多重针对list进行去重的方法,使用起来不光效率高,而且在针对大数据量的情况下也非常的好用,这里我们举个栗子。

先创建一个User实体类,构造方法什么的都正常写上

package com.cifs.bondbr.app.service.impl;
public class User{
    private String orderNumber;

    private String userName;

    private String age;

    @Override
    public String toString() {
        return "User{" +
                "orderNumber='" + orderNumber + '\'' +
                ", userName='" + userName + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

    public String getOrderNumber() {
        return orderNumber;
    }

    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public User(String orderNumber, String userName, String age) {
        this.orderNumber = orderNumber;
        this.userName = userName;
        this.age = age;
    }
}

然后再新建一个测试类,测试一下运行结果

List<User> infoList = new ArrayList<>();
        List<User> infoList1 = new ArrayList<>();
        infoList.add(new User("11111", "xiaoming", "22"));
        infoList.add(new User("22222", "xiaoming", "22"));
        infoList.add(new User("33333", "xiaoming", "23"));
        infoList.add(new User("11111", "xiaoming", "22"));
         infoList.stream()
                .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getUserName()+f.getAge()))), ArrayList::new))
                .forEach(System.out::println);


        for (int i = 0; i < infoList1.size(); i++) {
            System.out.println(infoList1.get(i));
        }

这是控制台打印的结果,可以看到我们根据name和age进行过滤去重

User{orderNumber='11111', userName='xiaoming', age='22'}
User{orderNumber='33333', userName='xiaoming', age='23'}

这里需要注意的一点就是如果说你从后台获取到的某些数据对应的字段存在null的情况下,就需要先一步进行一个过滤操作,然后才能进行去重,所以,优化以后的代码如下

		List<User> infoList = new ArrayList<>();
        List<User> infoList1 = new ArrayList<>();
        infoList.add(new User("11111", "xiaoming", "22"));
        infoList.add(new User("22222", "xiaoming", "22"));
        infoList.add(new User("33333", "xiaoming", "23"));
        infoList.add(new User("11111", "xiaoming", "22"));
        infoList1 = infoList.stream()
        		.filter(t->StringUtils.isNotBlank(t.getUserName()))
                .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getUserName()+f.getAge()))), ArrayList::new)).clone();
                /*.forEach(System.out::println);*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值