【问题标题】:How to group objects in a list with object property in Java如何在Java中使用对象属性对列表中的对象进行分组
【发布时间】:2021-08-11 09:47:21
【问题描述】:

如何分组列表中具有相同对象属性的所有对象?不提及对象属性值。

模型类:

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());

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

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

并制作一个 HashMap,其中 Key 作为项。 teamvalue 作为 具有该 team.name 和 item.id 的键值对列表

像这样:

"item.team":{
    "item.id":"item.name",
    "item.id":"item.name",
    "item.id":"item.name",
    .....
}

【问题讨论】:

  • 如果我们想要List,那么我不确定这是否可行。将List 转换为Map<String, List<Item>> 是否可行,其中键是类型(如String),值是所有Item 中的List 这种类型?
  • @Turing85 是的,这就足够了

标签: java arraylist linked-list hashmap java-stream


【解决方案1】:

来自Turing85 接受的答案。

我已经为我提出的问题创建了一个完整的解决方案

创建具有以下结构的输出:

"item.team":{
    "item.id":"item.name",
    "item.id":"item.name",
    "item.id":"item.name",
    .....
}

来源数据:

List<Item> itemsListData = //Get the data

项目分组功能:

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("-------------------------------------------");
}

输出:

Team A : 
Item 1= Item 1 name
Item 2= Item 2 name
-------------------------------------------
Team G : 
Item 456= Item 456 name
Item 254= Item 254 name
-------------------------------------------

Reference from baeldung.com

【讨论】:

    【解决方案2】:

    如果我们可以返回一个Map&lt;String, List&lt;Item&gt;&gt;,其中键是team,值是属于该团队的List&lt;Item&gt;,我们可以使用

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

    Ideone demo

    备注:此解决方案最初是由另一位用户在评论中发布的,不久之后他们删除了该评论。我不记得用户的名字。如果他们发布答案,我将删除我的。如果他们不想发布答案但与我联系,我会按姓名记入他们的姓名。

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

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

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

    【讨论】:

    • 在我的情况下Map&lt;String, List&lt;Item&gt;&gt; 给出了一个错误。我将其替换为Map&lt;Object, List&lt;Item&gt;&gt; itemsByTeam
    • 请更新您的答案,以便我接受
    • 是的,现在为我工作。 Eclipse 给了我一个错误并建议进行更改。
    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多