如何通过Project的ID对Task对象列表进行分组?
按Project的id分组Task对象的解决方案
你遇到的问题核心有两个:
- 直接用
task::getProject分组是按Project对象的引用相等性(默认equals比较内存地址)来分组,而非id,所以id相同但对象不同的Task会被分到不同组。 - Java不支持
task::getProject::getId这种链式方法引用,得换写法。
下面给两种可行的解决方式:
方式一:用Lambda表达式直接获取id
这是最简洁的写法,直接通过lambda链式调用拿到Project的id作为分组键:
tasks.stream().collect(Collectors.groupingBy(task -> task.getProject().getId()));
方式二:封装方法后用方法引用
如果想复用这个分组逻辑,或者偏好方法引用的写法,可以在Task类里新增一个获取Project id的方法:
public class Task { private Project project; // 新增方法,直接返回关联Project的id public int getProjectId() { return project.getId(); } // 原有的getProject方法(如果需要保留) public Project getProject() { return project; } }
之后就可以用方法引用实现分组:
tasks.stream().collect(Collectors.groupingBy(Task::getProjectId));
另外补充:如果你的Project类重写了equals和hashCode方法,让它们基于id判断对象相等性,那原来的task::getProject分组也能生效,但这种方式只适合业务上认为id相同就是同一个Project对象的场景,否则还是推荐直接按id分组的方式。
内容的提问来源于stack exchange,提问作者Samet DAĞ
相关产品推荐
相关产品推荐

