快速去重:使用Java根据对象某一属性去除重复对象的实现指南

这篇具有很好参考价值的文章主要介绍了快速去重:使用Java根据对象某一属性去除重复对象的实现指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 一、导言

🧐📚 Java中的对象去重操作?跟着小编一起学习吧!👇

在处理对象集合时,有时候我们需要根据对象的某个属性进行去重操作。Java给我们提供了多种方法来实现这个功能。今天,小编就来给大家介绍一下如何使用Java根据对象的某个属性进行去重操作。💫

方案一:使用自定义equals()和hashCode()方法

I.原理讲解

  • 提供一个自定义的类,包含需要去重的属性。
  • 重写equals()方法,比较对象的name属性是否相等。
  • 重写hashCode()方法,根据属性生成哈希码。
  • 使用HashSet或LinkedHashSet进行去重操作。

II. 代码示例

// 重新equals和hashCode方法
public class Person {

    public String name;
    public Integer age;
    public Sex sex;
    
   
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    ······
}

public class ObjectDistinctTest {

    public Person[] peoples;

    public List<Person> personList;

    // 构建数据源
    @Before
    public void before() {
        Person person = new Chinese("大白", 21, Sex.man);
        Person person1 = new Chinese("小兰", 25, Sex.woman);
        Person person2 = new Chinese("小红", 23, Sex.woman);
        Person person3 = new Chinese("小赵", 20, Sex.man);
        Person person4 = new Chinese("小青", 18, Sex.woman);
        Person person5 = new Chinese("小赵", 17, Sex.man);
        Person person6 = new Chinese("小麻", 50, Sex.man);
        this.peoples =new Person[]{ person, person1, person2, person3, person4, person5, person6};
        this.personList = Arrays.asList(peoples);
    }

    /**
     * 使用自定义equals()和hashCode()方法
     */
    @Test
    public void testCase01() {

        // 需求:根据Person对象的name属性进行去重,name属性相同,则视为重复元素
        // 存入顺序和取出顺序不一致
        Set<Person> distinctPersonSet = new HashSet<>();

        for (Person person : personList) {
            distinctPersonSet.add(person); //
        }

        List<Person> distinctPersonList = new ArrayList<>(distinctPersonSet);
        distinctPersonList.forEach(System.out::println); // 打印去重后的数据
    }

    /**
     * 使用自定义equals()和hashCode()方法
     */
    @Test
    public void testCase02() {
        // 或使用 LinkedHashSet 保持插入顺序
        Set<Person> distinctPersonSet = new LinkedHashSet<>();

        for (Person person : personList) {
            distinctPersonSet.add(person);
        }

        List<Person> distinctPersonList = new ArrayList<>(distinctPersonSet);
        distinctPersonList.forEach(System.out::println); // 打印去重后的数据
    }
}



方案二:使用循环和集合

I.原理讲解

  • 创建了一个新的集合来存储去重后的对象
  • 遍历集合列表
  • 判断对象属性是否重复
  • 去除重复对象

II. 代码示例

public class ObjectDistinctTest {

    public Person[] peoples;

    public List<Person> personList;

    // 构建数据源
    @Before
    public void before() {
        Person person = new Chinese("大白", 21, Sex.man);
        Person person1 = new Chinese("小兰", 25, Sex.woman);
        Person person2 = new Chinese("小红", 23, Sex.woman);
        Person person3 = new Chinese("小赵", 20, Sex.man);
        Person person4 = new Chinese("小青", 18, Sex.woman);
        Person person5 = new Chinese("小赵", 17, Sex.man);
        Person person6 = new Chinese("小麻", 50, Sex.man);
        this.peoples =new Person[]{ person, person1, person2, person3, person4, person5, person6};
        this.personList = Arrays.asList(peoples);
    }

    @Test
    public void testCase() {
        // 此方式无需实现equals方法
        List<Person> newList = new ArrayList<>();
        for (Person person: this.personList
        ) {
            if (newList.stream().noneMatch(x -> x.getName().equals(person.getName()))) { // 判断新集合中是否包含此对象,不包含才能加入到新集合中
                newList.add(person);
            }
        }
        List<Person> distinctList = newList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
        distinctList.forEach(System.out::println);
    }

}

方案三:使用自定义equals()和Java 8中的distinct方法

I.原理讲解

  • 提供一个自定义的类,包含需要去重的属性。
  • 重写equals()方法,比较对象的name属性是否相等。
  • 重写hashCode()方法,根据属性生成哈希码。
  • 使用Java 8Stream API中的distinct方法进行去重操作

II. 代码示例

// 重新equals和hashCode方法
public class Person {

    public String name;
    public Integer age;
    public Sex sex;
    
   
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    ······
}

public class ObjectDistinctTest {

    public Person[] peoples;

    public List<Person> personList;

    // 构建数据源
    @Before
    public void before() {
        Person person = new Chinese("大白", 21, Sex.man);
        Person person1 = new Chinese("小兰", 25, Sex.woman);
        Person person2 = new Chinese("小红", 23, Sex.woman);
        Person person3 = new Chinese("小赵", 20, Sex.man);
        Person person4 = new Chinese("小青", 18, Sex.woman);
        Person person5 = new Chinese("小赵", 17, Sex.man);
        Person person6 = new Chinese("小麻", 50, Sex.man);
        this.peoples =new Person[]{ person, person1, person2, person3, person4, person5, person6};
        this.personList = Arrays.asList(peoples);
    }

    /**
     * 使用自定义equals()和Stream API中的distinct方法实现元素的去重
     */
    @Test
    public void testCase01() {

        // 需求:根据Person对象的name属性进行去重,name属性相同,则视为重复元素
           this.personList.stream()    // 获取流对象
                .distinct()         // 去除重复元素
                .collect(Collectors.toList())   // 收集为List集合
                .forEach(System.out::println);  // 打印去重后的元素
    }
}



方案四:将List以name属性为key转换为Map

I.原理讲解

  • 使用Stream API中的终结方法collect
  • 将List转为Map,key为Person类中的name属性,value为Person对象
  • 获取使用values方法,获取Map中的value,即为去重后的List

II. 代码示例

public class ObjectDistinctTest {

    public Person[] peoples;

    public List<Person> personList;

    // 构建数据源
    @Before
    public void before() {
        Person person = new Chinese("大白", 21, Sex.man);
        Person person1 = new Chinese("小兰", 25, Sex.woman);
        Person person2 = new Chinese("小红", 23, Sex.woman);
        Person person3 = new Chinese("小赵", 20, Sex.man);
        Person person4 = new Chinese("小青", 18, Sex.woman);
        Person person5 = new Chinese("小赵", 17, Sex.man);
        Person person6 = new Chinese("小麻", 50, Sex.man);
        this.peoples =new Person[]{ person, person1, person2, person3, person4, person5, person6};
        this.personList = Arrays.asList(peoples);
    }

   
    @Test
    public void testCase03() {
        this.personList.stream() // 获取流对象
                .collect(Collectors.toMap(Person::getName, y -> y,(s, a) -> s))// 将List根据Person类中的name属性收集为Map,key为name,value为Person对象,当后面对象name属性跟前者相同时,使用前者。
                .values()    // 获取Map中的key
                .stream()
                .collect(Collectors.toList())
                .forEach(System.out::println);
    }
}

五、总结

想象一下,现在你可以轻松地根据对象的某一属性去除重复对象了!🚀

不仅如此,这个技巧还可以应用在各种不同的场景中,让你的代码更加简洁高效!💪

不管是初学者还是资深开发者,都会对这个技巧爱不释手!快来试试吧!😍文章来源地址https://www.toymoban.com/news/detail-757383.html

到了这里,关于快速去重:使用Java根据对象某一属性去除重复对象的实现指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • list根据对象中某个字段属性去重Java流实现

    在Java的流(Stream)中,你可以使用distinct方法来实现根据对象中某个字段属性去重的功能。要实现这个功能,你需要重写对象的hashCode和equals方法,以确保相同字段属性的对象被认为是相等的。以下是一个示例代码: 在上面的代码中,YourObject是你自定义的对象类型,你需要根据

    2024年02月10日
    浏览(62)
  • java8 列表通过 stream流 根据对象属性去重的三种实现方法

    0、User对象 1、使用filter进行去重 测试 ①、疑惑 既然 filter 里面调用的是 distinctPredicate 方法,而该方法每次都 new 一个新的 map 对象,那么 map 就是新的,怎么能做到可以过滤呢 ②、解惑 先看一下 filter 的部分实现逻辑,他使用了函数式接口 Predicate ,每次调用filter时,会使用

    2024年01月20日
    浏览(108)
  • Stream流中,根据对象去重+指定对象中的属性去重

    首先定义一个学生类: 在main方法中构造四个对象,其中第四个对象为重复对象,现在进行对象的去重、以及对象中某一属性的去重操作 一、根据对象去重: 以下代码写于main函数中: 运行结果如下,可以看到,stream流的distinct只是将对象去重,将相同的第三个和第四个对象

    2024年02月02日
    浏览(66)
  • Java通过Lambda表达式根据指定字段去除重复数据(集合去重)

    这里博主给大家封装好了一个工具类,里面有两个方法。 方法一:可以根据指定字段去除重复数据。 方法二:可以获取到重复的数据。 大家在使用过程中直接拷贝下方代码在要去重的类中调用即可。 导入这个工具类后怎么使用呢?我们接着往下看。 List rstList = list.stream()

    2024年02月16日
    浏览(55)
  • JAVA 使用stream流将List中的对象某一属性创建新的List

    Java Stream是Java 8引入的一种新机制,它可以让我们以声明式方式操作集合数据,提供了更加简洁、优雅的集合处理方式。Stream是一个来自数据源的元素队列,并支持聚合操作。它的特点有: Stream 不会修改原始数据源。 Stream 操作是延迟执行的。 Stream 操作可以是无限的(比如

    2024年02月03日
    浏览(59)
  • java 对象List中对象的某一属性重新赋值

    描述: 在我们开发过程中经常会遇到在拿到一个对象list集合的时候回对某一个字段重新赋值,比如:在无任务下面的若干子任务,开始执行主任务对子任务的状态统一设置待执行。这个时候就需要使用 Java8 stream 或者 List forEach 这两种方式来实现,方便快捷,也不需要再遍历

    2024年02月12日
    浏览(57)
  • java 对象list使用stream根据某一个属性转换成map的几种方式

    可以使用Java 8中的Stream API将List转换为Map,并根据某个属性作为键或值。以下是一些示例代码: 在这个示例中,将Person对象列表转换为Map,其中键为Person对象的name属性,值为Person对象本身。 在这个示例中,将Person对象列表转换为Map,其中键为Person对象本身,值为Person对象的

    2024年02月13日
    浏览(65)
  • Java中List集合对象去重及按属性去重的8种方法

    是大家最容易想到的,先把List数据放入Set,因为Set数据结构本身具有去重的功能,所以再将SET转为List之后就是去重之后的结果。这种方法在去重之后会改变原有的List元素顺序,因为HashSet本身是无序的,而TreeSet排序也不是List种元素的原有顺序。 去重后的集合: [kobe, james,

    2024年04月15日
    浏览(144)
  • golang实现es根据某字段分组,统计每组某一字段的数量,过滤空值并去重

    需求: 索引:dna 需求:根据app.Id分组,统计每组的OwnerBid数量,过滤空值并去重 dna索引结构 es查询语句 es查询结果 goalng实现 models.EsCountAgg 【面向校招】全力备战2023Golang实习与校招 欢迎进群交流:1007576722

    2024年02月17日
    浏览(48)
  • Stream流根据属性去重

    创建一个user集合 写一个Predict 使用filter方法 结果: 小结: 实质上是将每个元素都放到distinctByKey()中的ConcurrentHashMap作为key进行过滤,如果key不存在那么就加上去,如果已经存在了就不加。所以这种方式的过滤只保留第一个重复元素。 结果与上面的一样 同时过滤两个属性 结

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包