【问题标题】:Java 8 Stream - GroupingBy ClassJava 8 流 - 按类分组
【发布时间】:2018-02-13 20:44:18
【问题描述】:

我对 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 -&gt; person.city.postalcode) 的事情,但这样会生成Map&lt;String,List&lt;Person&gt;&gt; 类型的地图,而不是Map&lt;City,List&lt;Person&gt;&gt;

感谢您的帮助。

更新

要在一个类上使用groupingBy,它必须简单地正确实现equalshashcode

【问题讨论】:

    标签: java java-8 grouping java-stream


    【解决方案1】:
    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多