Java 8 Stream - GroupingBy类

时间:2018-02-13 20:44:18

标签: java java-8 grouping java-stream

我遇到了groupingBy方法的问题。 我用一个例子: 假设List<Person> Person.classCity.class就像这样

class Person{
   String name;
   String surname;
   City city;
}

class City{
   String name;
   String postalCode;
}

我会按city.postalcode对列表进行分组,并执行以下操作:

 List<Person> myList = ...some persons here...
 Map<City,List<Person>> groupMap = myList.stream().collect(
            Collectors.groupingBy(person -> person));

显然这不起作用,因为groupingBy不知道如何按对象分组。 我会做类似Collectors.groupingBy(person -> person.city.postalcode)之类的事情,但是这会产生Map<String,List<Person>>而不是Map<City,List<Person>>

类型的地图

感谢您的帮助。

更新

要在某个类上使用groupingBy,必须正确实现equalshashcode

1 个答案:

答案 0 :(得分:2)

Collectors.groupingBy(person -> person)
Collectors.groupingBy(person -> person.city.postalcode)

你想按城市分组吗?不要按人或邮政编码分组。正如您所说,按城市分组。

Collectors.groupingBy(person -> person.city)

正如您在问题中所述,City应覆盖equalshashCode

class City {
    String name;
    String postalCode;

    @Override public boolean equals(Object obj) {
        if (!(obj instanceof City)) {
            return false;
        }

        City that = (City) obj;

        return Objects.equals(this.name, that.name)
            && Objects.equals(this.postalCode, that.postalCode)
    }

    @Override public int hashCode() {
        return Objects.hash(name, postalCode);
    }
}