java8写一个以多个字段作为key,相同key只保留最新一条数据的共通方法
时间: 2024-04-29 07:23:38 浏览: 222
可以使用Java8中的Stream API和Collectors组合来实现该功能。具体实现步骤如下:
1. 定义一个包含多个字段的实体类,例如:
```
public class Entity {
private String field1;
private String field2;
private String field3;
private Date timestamp;
// 省略getter和setter方法
}
```
2. 定义一个方法,接收一个包含多条记录的List,返回根据多个字段去重后的最新记录:
```
public static List<Entity> filterLatest(List<Entity> entities) {
return entities.stream()
.collect(Collectors.groupingBy(
e -> Arrays.asList(e.getField1(), e.getField2(), e.getField3()),
Collectors.maxBy(Comparator.comparing(Entity::getTimestamp))
))
.values().stream()
.map(Optional::get)
.collect(Collectors.toList());
}
```
3. 在该方法中,先使用Stream的groupingBy方法,按照多个字段分组,并使用maxBy方法取得每组中timestamp字段最大的记录。由于maxBy方法返回的是Optional类型,需要使用map方法将其转换为实体类类型,并使用Collectors.toList方法将结果转换为List类型。
4. 调用该方法进行测试:
```
public static void main(String[] args) {
List<Entity> entities = new ArrayList<>();
entities.add(new Entity("A", "B", "C", new Date(1000)));
entities.add(new Entity("A", "B", "C", new Date(2000)));
entities.add(new Entity("D", "E", "F", new Date(3000)));
entities.add(new Entity("D", "E", "F", new Date(4000)));
List<Entity> latestEntities = filterLatest(entities);
System.out.println(latestEntities);
}
```
输出结果为:
```
[Entity{field1='A', field2='B', field3='C', timestamp=Thu Jan 01 08:00:02 CST 1970}, Entity{field1='D', field2='E', field3='F', timestamp=Thu Jan 01 08:00:04 CST 1970}]
```
可以看到,经过去重后,只保留了每个组中最新的记录。
阅读全文