我是编程新手,现在面临着一个棘手的问题:我得到了一个包含列表的对象,所以该对象看起来如下所示:
public class SampleClass {
private UUID id;
private List<ValueObject> values;
// getters, constructor, etc
}
ValueObject
包含一些字符串,如:
public class ValueObject {
private String firstName;
private String lastName;
private String address;
// getters, constructor, etc
}
我有一个SampleClass
示例,其中包含多个ValueObject
的列表。一些ValueObject
具有相同的firstName
和lastName
。
我想要归档的是,我想要过滤掉一个SampleClass
对象中具有相同firstName
和lastName
的所有ValueObject
,并且我想要将最后一个(根据遇到顺序)ValueObject
从列表中的每个组副本中保留出来。
我尝试了以下方法:
SampleClass listWithDuplicates = // intializing SampleClass instance
listWithDuplicates.getValues().stream()
.collect(Collectors.groupingBy(
ValueObject::getLastname,
Collectors.toList()
));
按姓氏分组,但是我怎么找到匹配的名字,因为姓氏可以相等,但是名字可以不同,所以我想把它保留在我的对象中,因为它不相等。然后怎么删除重复的?谢谢你的帮助
- 更新**:列表的顺序不应受到删除重复项的影响。
重复项列表
保存SampleClass对象。
4条答案
按热度按时间ssgvzors1#
您可以通过使用 * 四参数版本 * 的收集器
toMap()
来解决此问题,该版本需要以下参数:如果您无法在
ValueObject
中更改equals/hashCode
的实现,则可以引入一个辅助类型作为Key。***注意:*如果您可以在
firstName
和lastName
上覆盖ValueObject
的equals/hashCode
协定,则不需要上面显示的辅助类型。在下面的代码中,您可以将Function.identity()
用作toMap()
的keyMapper和valueMapper。流可以这样实现:
snz8szmq2#
您可以覆盖
ValueObject
类中的equals
和hashCode
方法(未测试):然后,您所需要的就是使用
Stream#distinct
删除重复项您可以阅读this answer以获得更多有关的信息。
xytpbqjk3#
我不能把它放到流中,但是如果你真的在valueObject中创建了一个基于name和firstname的equals方法,你可以基于对象进行过滤,把这个放在ValueObject中:
那么你应该可以很好地使用这样的循环:
但是在流中会更好,..但是如果你实现了equals方法,你可以解决这个问题。
ttygqcqt4#
我喜欢已经提供的答案,并认为它们为您给予了答案,但也许出于学习的目的,另一种方法可以是使用
Collector
,它比较每个ValueObject的firstName和lastName字段,然后只保留最后一个重复的示例。因此,您可以使用一个COllector按
lastName
和firstName
对ValueObject示例进行分组,该COllector创建一个Map,该Map的键是连接在一起的lastName
和firstName
。collectingAndThen
收集器将Map转换为ValueObject列表。