什么是在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)); 
    } 
    } 
} 
+3

更换'.collect(Collectors.toSet())。流()'和'.distinct()' –

+0

这将正常工作,但我应该提到,我需要使用比不同的方法.equals()进行比较,因为它使用了id,我正在寻找唯一的名称。有没有类似的方法可以让你提供一个lambda进行比较? @LouisWasserman –

+0

你称之为“独特”是什么?基于equals()方法的对象?它们是不可变的吗? – lvr123

我之前以为我将无法使用.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);