java - 使用 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>) 中声明的对象
有人可以解释这个错误吗?
解决方案
尝试这个:
final var filtered = persons.stream().collect(Collectors.groupingBy(Person::getGender));
推荐阅读
- java - 在 Java 中格式化浮点数 (#.###.##)
- php - 在while循环中获取当前帖子类别名称
- powershell - Get-ChildItem 和“DIR”返回不同的文件/文件夹计数?
- sapui5 - SAPUI5 List Item上下文绑定,获取下一个路径
- c - 如何将数据(行)添加到 GtkListBox (C)
- python - 无法在 appium/python 中找到元素
- ios - 如何使用 cocoapods 和工作区构建一个反应原生项目?
- javascript - Intro.Js 无法在 PHP 上运行
- typescript - 如何在 TypeScript 中使用本地库开发项目?
- laravel - 多个表的 Laravel Eloquent 关系