什么是在Java中创建“唯一”对象列表的最佳方式
问题描述:
我想创建一个唯一的列表。我不能使用“Set”,因为我需要在迭代它时指定一些值。什么是在Java中创建“唯一”对象列表的最佳方式
现在我正在做这个来创建一个唯一的列表。有谁知道更好的方法?
List<Thing> things = previousThings.stream()
.collect(Collectors.toSet()).stream()
.collect(Collectors.toList());
我在想,如果我把它转换成一个集合并返回列表,它会消除任何重复的条目。我认为它需要是一个列表,以便我可以使用“List.set(..)”根据可能已存在于我的存储库中的内容进行更新。
for(int i = 0; i < things.size(); i++) {
if(things.get(i).id == null) {
existingThing = thingRepository.getByName(things.get(i).getName());
if(existingThing != null) {
things.set(i, existingThing);
} else {
things.set(i, thingRepository.save(things.get(i));
}
}
}
答
我之前以为我将无法使用.distinct()因为它使用了基于断“Thing.id” .equals()和一些“东西”唐”的还没有'id'。然后我意识到,在forLoop的最后,所有内容都由存储库分配一个id。
List<Thing> things = previousThings;
for(int i = 0; i < things.size(); i++) {
if(things.get(i).id == null) {
existingThing = thingRepository.getByName(things.get(i).getName());
if(existingThing != null) {
things.set(i, existingThing);
} else {
things.set(i, thingRepository.save(things.get(i));
}
}
}
List<Thing> distinctThings = things.stream().distinct().collect(Collectors.toList);
更换'.collect(Collectors.toSet())。流()'和'.distinct()' –
这将正常工作,但我应该提到,我需要使用比不同的方法.equals()进行比较,因为它使用了id,我正在寻找唯一的名称。有没有类似的方法可以让你提供一个lambda进行比较? @LouisWasserman –
你称之为“独特”是什么?基于equals()方法的对象?它们是不可变的吗? – lvr123