[英]How to group objects in a list with object property in Java
如何將具有相同 Object 屬性的列表中的所有對象分組? 無需提及 Object 屬性值。
Model Class:
public class Item {
private String id;
private String name;
private String team
}
List<item> items = new ArrayList();
我試過這個:
items.stream().filter(item -> "Elites".equals(item.team)).collect(Collectors.toList());
但這需要將團隊名稱作為參數傳遞。
我們如何在不指定團隊價值的情況下對項目進行分組?
並以Key為項目制作HashMap 。 team和value作為具有該 team.name 和 item.id 的鍵值對列表
像這樣:
"item.team":{
"item.id":"item.name",
"item.id":"item.name",
"item.id":"item.name",
.....
}
如果我們可以返回一個Map<String, List<Item>>
,其中鍵是team
,值是屬於該團隊的List<Item>
,我們可以使用
final Map<String, List<Item>> itemsByTeam =
items.stream().collect(Collectors.groupingBy(item -> item.team));
備注:此解決方案最初是由另一個用戶在評論中發布的,不久之后他們刪除了該評論。 我不記得用戶的名字。 如果他們發布答案,我將刪除我的。 如果他們不想發布答案,但與我聯系,我將通過姓名記入他們的姓名。
對代碼的評論:我建議為屬性引入 getter,因為stream
操作最有可能在 class Item
本身之外調用,因此屬性team
將不可見。 此外,這將導致類似的實現
final Map<String, List<Item>> itemsByTeam =
items.stream().collect(Collectors.groupingBy(Item::getTeam));
這可能會或可能不會被認為對讀者“更令人愉悅”。
從Turing85接受的答案。
我為我提出的問題創建了一個完整的解決方案。
創建具有以下結構的 output:
"item.team":{
"item.id":"item.name",
"item.id":"item.name",
"item.id":"item.name",
.....
}
源數據:
List<Item> itemsListData = //Get the data
Function 對項目進行分組:
public static Map<String, List<Item>> groupItemsByTeam(Collection<Item> itemsList) {
return itemsList.stream().collect(Collectors.groupingBy(Item::team));
}
構造由groupItemsByTeam返回的項目列表:
//GET THE GROUPED DATA
Map<String, List<Item>> result = groupItemsByTeam(itemsListData);
//STRUCTURE THE GROUPED DATA
for (Entry<String, List<Item>> parentItem : result .entrySet()) {
System.out.println(parentItem .getKey() + " : "); // item.team value
for (Item childItem : parentItem.getValue()) {
System.out.println(childItem.getKEY() + " = " + childItem.getVALUE());
}
System.out.println("-------------------------------------------");
}
OUTPUT:
Team A :
Item 1= Item 1 name
Item 2= Item 2 name
-------------------------------------------
Team G :
Item 456= Item 456 name
Item 254= Item 254 name
-------------------------------------------
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.