参考: 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); } }
相关推荐
例如,`ArrayList`和`HashMap`在多线程环境下不是线程安全的,而在某些场景下,我们可以选择使用`Vector`、`ConcurrentHashMap`等线程安全的集合类。 #### 三、揭开神秘的锁机制 Java中的锁机制是实现多线程同步的...
以上是Java基础知识题的部分解析,涵盖了类与对象、继承、接口、异常处理、数据类型、内存管理、字符串操作、集合框架、线程和变量命名等多个核心概念。了解并掌握这些知识点对于深入学习Java编程至关重要。
14. Set中的元素去重:Set依赖于hashCode()和equals()方法判断元素是否重复,不使用==进行比较。==比较的是对象引用,而equals()比较的是对象内容。 15. 常见的RuntimeException:例如NumberFormatException、...
- **`Collections`**:是Java中的一个工具类,提供了一系列静态方法来对集合进行操作,如排序、查找等。 ### 6. 断言(Assert)的使用 断言是一种简单的调试方式,在开发阶段可以帮助检测代码的错误。在运行时系统...
- 抽象类中可以有静态的`main`方法,这使得抽象类可以在某些情况下作为独立的程序入口点。 #### 日志级别 `log4j`的日志级别包括`OFF`、`FATAL`、`ERROR`、`WARN`、`INFO`、`DEBUG`、`ALL`。这些级别定义了日志...
在Java编程中,对象的容纳是一个核心概念,特别是在动态创建和管理对象的...这些集合类是Java集合框架的一部分,是Java编程中不可或缺的工具,它们允许程序员更灵活地管理和操作对象,弥补了数组在某些场景下的不足。
网络爬虫是互联网数据挖掘的一种重要工具,它能够自动地浏览网页并提取所需信息。在Java环境下实现网络爬虫,我们需要掌握以下几个核心知识点: ...在实际项目中,还需要根据具体需求和目标网站的特点进行调整和优化。
- **`Collections`**: 是一个工具类,提供了针对集合的操作方法,如排序、搜索等。 #### 六、断言 (`assert`) - 断言是在软件开发中用来验证程序假设条件的一种手段。 - 在调试过程中,可以通过启用断言来确保代码...
- 删除图书则需要根据图书的某些属性(比如标题或作者)来找到相应的对象并将其从列表中移除; - 搜索功能可以根据图书的不同属性来进行。 **首先,定义 Book 类来存储图书的信息:** ```java public class Book...
7. **操作字符串的类**:在Java中操作字符串常用的类有String、StringBuilder和StringBuffer。String是不可变类,每次修改都会生成新的对象;StringBuilder和StringBuffer是可变类,可以用来进行字符串的拼接和修改...
在Redis中,list(列表)是由一系列按照插入顺序排序的字符串元素组成的,相当于Java中的LinkedList,支持两端的push和pop操作,即在列表头部和尾部进行插入和删除操作。这种数据结构适合用于实现消息队列、栈、文章...
对于性能和内存的权衡,可以根据具体应用进行调整,例如,如果对内存占用敏感,可以选择代码C;如果追求效率,代码D可能更合适。而对于去重的准确性,代码A、B、C和D在大多数情况下都能满足要求,而代码E则需要谨慎...
计算机二级等级考试主要涵盖计算机基础知识、编程语言、数据库、网页制作等多个方面,下面根据题目内容进行详细解析: 1. 接口是Java等面向对象语言中的一个重要概念,它是一种完全抽象的类,不能实例化,只能被...
- **概述**:双端队列允许在两端进行插入和删除操作。 - **链表实现**:使用链表实现双端队列。 - **数组实现**:使用数组实现双端队列。 **2.7 优先级队列** - **无序数组实现**:使用无序数组实现优先级队列。 -...
8. Access 数据类型的排序与索引:Access允许对文本、数字和自动编号类型的数据进行排序和索引,但备注类型的数据由于其特殊性,通常不能进行排序或索引。 9. 数据库系统的优点:数据库系统减少了数据冗余,提高了...
8. Java线程类位置:`Thread`类位于`java.lang`包中,是Java多线程编程的基础。 9. 域名类型:`.org`是代表非营利组织的域名后缀。 10. 段落标记打印:在Word中,段落标记在屏幕上可见,但在打印时不显示。 11. ...
因此,静态成员是根据类的类型进行访问的。 ### 21. 十六进制整数 `0xC5` 是一个十六进制整数,在 Python 或其他编程语言中表示十进制数 197。 ### 22. 存储过程调用接口 - **CallableStatement**:用于调用...
而实例对象则是根据类创建的具体对象。类属性是类的所有实例共享的属性,而实例属性则是每个实例独有的属性。 - **类对象与实例对象**: - 类对象定义了对象的结构和行为,是创建实例对象的模板。 - 实例对象是...
8. 在Java中,类A定义了方法f和g,其中f是静态方法,可以直接通过类名调用,g是非静态方法,需要通过对象实例调用。因此,合法的用法是A(调用静态方法f)、B(调用静态方法f)和D(通过对象a1调用非静态方法g)。...
Java 不支持使用汉字作为变量名(尽管某些开发环境可能提供一定程度的支持);Java 在数组操作中会自动检测数组下标越界的情况,并抛出异常。 #### 9. Word 拼写检查 - **题目解析**:Word 提供了强大的文本编辑和...