如何在 Java 中使用对象属性对列表中的对象进行分组

Len*_*man 2 java linked-list arraylist hashmap java-stream

如何将具有相同对象属性的列表中的所有对象分组无需提及 Object 属性值。

型号类别:

public class Item {
  private String id;
  private String name;
  private String team
}
Run Code Online (Sandbox Code Playgroud)

List<item> items = new ArrayList();

我已经尝试过这个:

items.stream().filter(item -> "Elites".equals(item.team)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但这需要将团队名称作为参数传递。

我们如何在不指定团队值的情况下对项目进行分组?

并制作一个以Key作为项目的HashMap teamvalue作为带有 team.name 和 item.id 的键值对列表

像这样:

"item.team":{
    "item.id":"item.name",
    "item.id":"item.name",
    "item.id":"item.name",
    .....
}
Run Code Online (Sandbox Code Playgroud)

Tur*_*g85 6

如果我们可以返回 a Map<String, List<Item>>,其中键是 the team,值是List<Item>属于该团队的 a ,我们可以使用

final Map<String, List<Item>> itemsByTeam = 
    items.stream().collect(Collectors.groupingBy(item -> item.team));
Run Code Online (Sandbox Code Playgroud)

Ideone demo

备注:此解决方案首先由另一位用户在评论中发布,不久后他们删除了该评论。我不记得用户名了。如果他们发布答案,我将删除我的答案。如果他们不想发表答案,而是联系我,我会注明他们的名字。

对代码的评论:我建议为属性引入 getter,因为stream- 操作最有可能在类本身之外调用Item,因此属性team将不可见。此外,这将导致像这样的实现

final Map<String, List<Item>> itemsByTeam = 
    items.stream().collect(Collectors.groupingBy(Item::getTeam));
Run Code Online (Sandbox Code Playgroud)

这可能会或可能不会被读者视为“更令人愉悦”。