`
kanpiaoxue
  • 浏览: 1781251 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java8根据类的某些属性进行去重操作

 
阅读更多

 

参考: https://stackoverflow.com/questions/23699371/java-8-distinct-by-property

 

 

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;

public class Person {
    private Integer id;
    private String firstName;
    private String secondName;

    /**
     *
     */
    public Person() {
        super();
    }

    /**
     * @param id
     * @param firstName
     * @param secondName
     */
    public Person(Integer id, String firstName, String secondName) {
        super();
        this.id = id;
        this.firstName = firstName;
        this.secondName = secondName;
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        if (firstName == null) {
            if (other.firstName != null) {
                return false;
            }
        } else if (!firstName.equals(other.firstName)) {
            return false;
        }
        if (id == null) {
            if (other.id != null) {
                return false;
            }
        } else if (!id.equals(other.id)) {
            return false;
        }
        if (secondName == null) {
            if (other.secondName != null) {
                return false;
            }
        } else if (!secondName.equals(other.secondName)) {
            return false;
        }
        return true;
    }

    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * @return the id
     */
    public Integer getId() {
        return id;
    }

    /**
     * @return the secondName
     */
    public String getSecondName() {
        return secondName;
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((secondName == null) ? 0 : secondName.hashCode());
        return result;
    }

    /**
     * @param firstName
     *            the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * @param id
     *            the id to set
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * @param secondName
     *            the secondName to set
     */
    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Person [id=" + id + ", firstName=" + firstName + ", secondName=" + secondName + "]";
    }

    public static void main(String[] args) {
        Person p1 = new Person(1, "wang", "gang");
        Person p2 = new Person(2, "wang", "qiang");
        Person p3 = new Person(3, "wang", "cheng");
        Person p4 = new Person(4, "wang", "qiang");
        Person p5 = new Person(5, "wang", "cheng");
        List<Person> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        System.out.println(list);
        /*
         * output:
         * [Person [id=1, firstName=wang, secondName=gang], Person [id=2,
         * firstName=wang, secondName=qiang], Person [id=3, firstName=wang,
         * secondName=cheng]]
         */
        List<Person> distinctList = list.stream()
                .collect(Collectors.collectingAndThen(Collectors.toCollection(
                        // 利用 TreeSet 的排序去重构造函数来达到去重元素的目的
                        // 根据firstName去重
                        () -> new TreeSet<>(Comparator.comparing(Person::getFirstName))), ArrayList::new));
        /*
         * output:
         * [Person [id=1, firstName=wang, secondName=gang]]
         */
        System.out.println(distinctList);

        List<Person> distinctList1 = list.stream().collect(Collectors
                .collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> {
                    // 根据firstName和secondName进行去重
                    return o.getFirstName() + "," + o.getSecondName();
                }))), ArrayList::new));
        /*
         * output:
         * [Person [id=3, firstName=wang, secondName=cheng], Person [id=1,
         * firstName=wang, secondName=gang], Person [id=2, firstName=wang,
         * secondName=qiang]]
         */
        System.out.println(distinctList1);

        TreeSet<Person> set = new TreeSet<>(Comparator.comparing(o -> {
            // 根据firstName和secondName进行去重
            return o.getFirstName() + "," + o.getSecondName();
        }));
        set.addAll(list);
        /*
         * output:
         * [Person [id=3, firstName=wang, secondName=cheng], Person [id=1,
         * firstName=wang, secondName=gang], Person [id=2, firstName=wang,
         * secondName=qiang]]
         */
        System.out.println(set);
    }
}

 

分享到:
评论

相关推荐

    java常见疑惑与陷阱

    例如,`ArrayList`和`HashMap`在多线程环境下不是线程安全的,而在某些场景下,我们可以选择使用`Vector`、`ConcurrentHashMap`等线程安全的集合类。 #### 三、揭开神秘的锁机制 Java中的锁机制是实现多线程同步的...

    50道JAVA基础知识题

    以上是Java基础知识题的部分解析,涵盖了类与对象、继承、接口、异常处理、数据类型、内存管理、字符串操作、集合框架、线程和变量命名等多个核心概念。了解并掌握这些知识点对于深入学习Java编程至关重要。

    Java常见面试50题(java+jsp)

    14. Set中的元素去重:Set依赖于hashCode()和equals()方法判断元素是否重复,不使用==进行比较。==比较的是对象引用,而equals()比较的是对象内容。 15. 常见的RuntimeException:例如NumberFormatException、...

    最新最全的java面试题汇总

    - **`Collections`**:是Java中的一个工具类,提供了一系列静态方法来对集合进行操作,如排序、查找等。 ### 6. 断言(Assert)的使用 断言是一种简单的调试方式,在开发阶段可以帮助检测代码的错误。在运行时系统...

    java面试题和基础知识汇总超详细

    - 抽象类中可以有静态的`main`方法,这使得抽象类可以在某些情况下作为独立的程序入口点。 #### 日志级别 `log4j`的日志级别包括`OFF`、`FATAL`、`ERROR`、`WARN`、`INFO`、`DEBUG`、`ALL`。这些级别定义了日志...

    第8章 对象的容纳.pdf

    在Java编程中,对象的容纳是一个核心概念,特别是在动态创建和管理对象的...这些集合类是Java集合框架的一部分,是Java编程中不可或缺的工具,它们允许程序员更灵活地管理和操作对象,弥补了数组在某些场景下的不足。

    网络爬虫(java)

    网络爬虫是互联网数据挖掘的一种重要工具,它能够自动地浏览网页并提取所需信息。在Java环境下实现网络爬虫,我们需要掌握以下几个核心知识点: ...在实际项目中,还需要根据具体需求和目标网站的特点进行调整和优化。

    JAVA面试大全

    - **`Collections`**: 是一个工具类,提供了针对集合的操作方法,如排序、搜索等。 #### 六、断言 (`assert`) - 断言是在软件开发中用来验证程序假设条件的一种手段。 - 在调试过程中,可以通过启用断言来确保代码...

    Java宝典:数组与集合的神秘面纱-从新手到高手的进阶之路.pdf

    - 删除图书则需要根据图书的某些属性(比如标题或作者)来找到相应的对象并将其从列表中移除; - 搜索功能可以根据图书的不同属性来进行。 **首先,定义 Book 类来存储图书的信息:** ```java public class Book...

    1剑盛二面准备试题.txt1剑盛二面准备试题.txt

    7. **操作字符串的类**:在Java中操作字符串常用的类有String、StringBuilder和StringBuffer。String是不可变类,每次修改都会生成新的对象;StringBuilder和StringBuffer是可变类,可以用来进行字符串的拼接和修改...

    redis基础数据结构讲解

    在Redis中,list(列表)是由一系列按照插入顺序排序的字符串元素组成的,相当于Java中的LinkedList,支持两端的push和pop操作,即在列表头部和尾部进行插入和删除操作。这种数据结构适合用于实现消息队列、栈、文章...

    详解javascript数组去重问题

    对于性能和内存的权衡,可以根据具体应用进行调整,例如,如果对内存占用敏感,可以选择代码C;如果追求效率,代码D可能更合适。而对于去重的准确性,代码A、B、C和D在大多数情况下都能满足要求,而代码E则需要谨慎...

    2021-2022计算机二级等级考试试题及答案No.16201.docx

    计算机二级等级考试主要涵盖计算机基础知识、编程语言、数据库、网页制作等多个方面,下面根据题目内容进行详细解析: 1. 接口是Java等面向对象语言中的一个重要概念,它是一种完全抽象的类,不能实例化,只能被...

    数据结构与算法 全 数据结构与算法全 Java

    - **概述**:双端队列允许在两端进行插入和删除操作。 - **链表实现**:使用链表实现双端队列。 - **数组实现**:使用数组实现双端队列。 **2.7 优先级队列** - **无序数组实现**:使用无序数组实现优先级队列。 -...

    2021-2022计算机二级等级考试试题及答案No.19305.docx

    8. Access 数据类型的排序与索引:Access允许对文本、数字和自动编号类型的数据进行排序和索引,但备注类型的数据由于其特殊性,通常不能进行排序或索引。 9. 数据库系统的优点:数据库系统减少了数据冗余,提高了...

    2021-2022计算机二级等级考试试题及答案No.13539.docx

    8. Java线程类位置:`Thread`类位于`java.lang`包中,是Java多线程编程的基础。 9. 域名类型:`.org`是代表非营利组织的域名后缀。 10. 段落标记打印:在Word中,段落标记在屏幕上可见,但在打印时不显示。 11. ...

    2021-2022计算机二级等级考试试题及答案No.10430.docx

    因此,静态成员是根据类的类型进行访问的。 ### 21. 十六进制整数 `0xC5` 是一个十六进制整数,在 Python 或其他编程语言中表示十进制数 197。 ### 22. 存储过程调用接口 - **CallableStatement**:用于调用...

    2021-2022计算机二级等级考试试题及答案No.1389.docx

    而实例对象则是根据类创建的具体对象。类属性是类的所有实例共享的属性,而实例属性则是每个实例独有的属性。 - **类对象与实例对象**: - 类对象定义了对象的结构和行为,是创建实例对象的模板。 - 实例对象是...

    2021-2022计算机二级等级考试试题及答案No.15737.docx

    8. 在Java中,类A定义了方法f和g,其中f是静态方法,可以直接通过类名调用,g是非静态方法,需要通过对象实例调用。因此,合法的用法是A(调用静态方法f)、B(调用静态方法f)和D(通过对象a1调用非静态方法g)。...

    2021-2022计算机二级等级考试试题及答案No.3327.docx

    Java 不支持使用汉字作为变量名(尽管某些开发环境可能提供一定程度的支持);Java 在数组操作中会自动检测数组下标越界的情况,并抛出异常。 #### 9. Word 拼写检查 - **题目解析**:Word 提供了强大的文本编辑和...

Global site tag (gtag.js) - Google Analytics