2016-08-03 188 views
0

我想創建一個唯一的列表。我不能使用「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

回答

0

我之前以爲我將無法使用.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); 
相關問題