Java 8 Stream - 按类分组

use*_*888 -1 java grouping java-8 java-stream

我的 groupingBy 方法有问题。我举个例子:假设有一个List<Person>wherePerson.classCity.classare like this

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

class City{
   String name;
   String postalCode;
}
Run Code Online (Sandbox Code Playgroud)

我会将列表分组city.postalcode并执行如下操作:

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

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

谢谢你的帮助。

更新

为了groupingBy在类上使用,它必须简单地正确实现 equals并且hashcode

Joh*_*ica 5

Collectors.groupingBy(person -> person)
Collectors.groupingBy(person -> person.city.postalcode)
Run Code Online (Sandbox Code Playgroud)

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

Collectors.groupingBy(person -> person.city)
Run Code Online (Sandbox Code Playgroud)

正如您在问题中所述,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);
    }
}
Run Code Online (Sandbox Code Playgroud)