多属性的Java 8流组列表

hgqdbh6s  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(138)

我有一个项目列表。我想按3个属性(类别,颜色,城市)对此列表进行分组。
示例:

ID;Category;Color;City;Name
1;1;Red,Rome,Shoe A
2;1;Red,Paris,Shoe C
3;1;Green,Rome,Scarf
4;1;Red,Rome,Shoe B
5;2;Red,Rome,Scarf
6;1;Red,Rome,Scarf
7;1;Green,Rome,Shoe

所以最后我有一个列表,如下所示:

1;Red;Rome => ID (1,4, 6)
1;Red;Paris => ID(2) 
1;Green,Rome => ID(3,7)
2;Red;Rome => ID(5)

我知道如何按属性对列表进行分组:

Map<Category, List<Items>> _items = items.stream().collect(Collectors.groupingBy(item -> item.getCategory()));

但是如何处理多个属性呢?

smdnsysy

smdnsysy1#

你需要创建一个对象,作为唯一标识元组的键,元组由3个值CategoryColorCity组成。

public class Key {
  private final int category;
  private final String color;
  private final String city;

  public Key(int category, String color, String city) {
    this.category = category;
    this.color = color;
    this.city = city;
  }

  //Getter

  public static Key fromItem(Item item) {
    //create the key from the item
    return new Key(item.getCategory(),...)
  }

  @Override
  public boolean equals(Object o) {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;
     Key key = (Key) o;
     return category == key.category && color.equals(key.color) && city.equals(key.city);
  }

  @Override
  public int hashCode() {
     return Objects.hash(category, color, city);
  }
}

然后,您可以对代码行进行简单的修改:

Map<Key, List<Items>> _items = items.stream().collect(Collectors.groupingBy(Key::fromItem));

相关问题