首页 > 解决方案 > 使用 Java Collectors.toMap 对具有特定字段的对象进行分组

问题描述

我想根据性别对 Person 对象进行分组,其 Collectors.toMap() 功能如下所述,但这并不像我预期的那样工作。

class Person{
   private Integer id;
   private String gender;
   private String name;
   public String getGender(){
       return gender;
   }
   public Person(Integer id, String gender, String name){
       this.id=id;
       this.gender=gender;
       this.name=name;    
   }
}


public static void main(String[]args){
   List<Person> persons=new ArrayList<>();
   persons.add(new Person(1,"Man","John"));
   persons.add(new Person(2,"Man","Steve"));
   persons.add(new Person(3,"Women","Linda"));
   persons.add(new Person(4,"Man","Bill"));
   persons.add(new Person(5,"Women","Siti"));
   persons.add(new Person(6,"Man","Buzzer"));

   Map<String,List<Person>> filtered=persons
            .stream()
            .collect(Collectors.toMap(Person:getGender:Function.identity()));

}

错误提示

不兼容的类型:推理变量 U 具有不兼容的边界等式约束:列出下限:Person,T#2,T#1 其中 U,T#1,K,T#2 是类型变量:U 扩展方法中声明的对象 <T #1,K,U>toMap(Function<? super T#1,? > > extends K>,Function<? super T#1,? extends U>) T#1 扩展在方法 <T#1 中声明的对象, K,U>toMap(Function<? super T#1,?> extends K>,Function<? super T#1,? extends U>) K 扩展方法中声明的对象 <T#1,K,U>toMap( Function<? super T#1,?> extends K>,Function<? super T#1,? extends U>) T#2 extends Object 在方法 <T#2>identity() 中声明

<R,A>collect(Collector<? super T,A,R>) 的类型是错误的,其中 R,A,T 是类型变量:R 扩展方法中声明的对象 <R,A>collect(Collector<? super T,A,R>) A 扩展了在方法 <R,A>collect(Collector<? super T,A,R>) 中声明的对象

有人可以解释这个错误吗?

标签: java

解决方案


尝试这个:

final var filtered = persons.stream().collect(Collectors.groupingBy(Person::getGender));

推荐阅读