java实现用户分组,探讨一种 Java 实现分组的方法

我这里实现了一种分组方式,但是始终感觉太过暴力,有没有大佬提供一种更优雅的方式来进行 Java 对象 List 的分组呢?

需求:

原数据格式

[

{"stuNum":"001","stuName":"Tom","course":"语文","score":65},

{"stuNum":"001","stuName":"Tom","course":"数学","score":80},

{"stuNum":"001","stuName":"Tom","course":"英语","score":88},

{"stuNum":"002","stuName":"Mike","course":"语文","score":70},

{"stuNum":"002","stuName":"Mike","course":"数学","score":85},

{"stuNum":"002","stuName":"Mike","course":"英语","score":90},

{"stuNum":"003","stuName":"Lucy","course":"语文","score":70},

{"stuNum":"003","stuName":"Lucy","course":"数学","score":60}

]

复制代码

目标数据格式:

[

{"stuNum":"001","stuName":"Tom","courseScoreList":[

{"course":"语文","score":65},

{"course":"数学","score":80},

{"course":"英语","score":88}]

},

{"stuNum":"002","stuName":"Mike","courseScoreList":[

{"course":"语文","score":70},

{"course":"数学","score":85},

{"course":"英语","score":90}]

},

{"stuNum":"003","stuName":"Lucy","courseScoreList":[

{"course":"语文","score":70},

{"course":"数学","score":60}]

}

]

复制代码

我把代码放在这里大家探讨一下(可复制到 IDE 中执行查看效果,依赖包自行引入):

public class GroupBySomeProperty {

@Test

public void groupByTest() throws JsonProcessingException {

ObjectMapper objectMapper = new ObjectMapper();

List scoreList = getTestData();

List gradeList = groupByStu(scoreList);

System.out.println(objectMapper.writeValueAsString(scoreList));

System.out.println(objectMapper.writeValueAsString(gradeList));

}

private List groupByStu(List scoreList) {

List gradeList = scoreList.parallelStream().filter(distinctByKey(StudentScore::getStuNum)).map(score -> new StudentGrade() {{

setStuNum(score.getStuNum());

setStuName(score.getStuName());

}}).collect(Collectors.toList());

for (StudentGrade grade : gradeList) {

List tempCourseScoreList = scoreList.stream()

.filter(score -> score.getStuNum().equals(grade.stuNum))

.map(score -> new CourseScore() {{

setCourse(score.getCourse());

setScore(score.getScore());

}}).collect(Collectors.toList());

grade.setCourseScoreList(tempCourseScoreList);

}

return gradeList;

}

private static Predicate distinctByKey(Function super T, ?> keyExtractor) {

Set seen = ConcurrentHashMap.newKeySet();

return t -> seen.add(keyExtractor.apply(t));

}

private List getTestData() {

StudentScore student1 = new StudentScore() {{

setStuNum("001");

setStuName("Tom");

setCourse("语文");

setScore(65);

}};

StudentScore student2 = new StudentScore() {{

setStuNum("001");

setStuName("Tom");

setCourse("数学");

setScore(80);

}};

StudentScore student3 = new StudentScore() {{

setStuNum("001");

setStuName("Tom");

setCourse("英语");

setScore(88);

}};

StudentScore student4 = new StudentScore() {{

setStuNum("002");

setStuName("Mike");

setCourse("语文");

setScore(70);

}};

StudentScore student5 = new StudentScore() {{

setStuNum("002");

setStuName("Mike");

setCourse("数学");

setScore(85);

}};

StudentScore student6 = new StudentScore() {{

setStuNum("002");

setStuName("Mike");

setCourse("英语");

setScore(90);

}};

StudentScore student7 = new StudentScore() {{

setStuNum("003");

setStuName("Lucy");

setCourse("语文");

setScore(70);

}};

StudentScore student8 = new StudentScore() {{

setStuNum("003");

setStuName("Lucy");

setCourse("数学");

setScore(60);

}};

return new ArrayList() {{

add(student1);

add(student2);

add(student3);

add(student4);

add(student5);

add(student6);

add(student7);

add(student8);

}};

}

private class StudentGrade {

private String stuNum;

private String stuName;

private List courseScoreList;

public String getStuNum() {

return stuNum;

}

public void setStuNum(String stuNum) {

this.stuNum = stuNum;

}

public String getStuName() {

return stuName;

}

public void setStuName(String stuName) {

this.stuName = stuName;

}

public List getCourseScoreList() {

return courseScoreList;

}

public void setCourseScoreList(List courseScoreList) {

this.courseScoreList = courseScoreList;

}

}

private class CourseScore {

private String course;

private Integer score;

public String getCourse() {

return course;

}

public void setCourse(String course) {

this.course = course;

}

public Integer getScore() {

return score;

}

public void setScore(Integer score) {

this.score = score;

}

}

private class StudentScore {

private String stuNum;

private String stuName;

private String course;

private Integer score;

public String getStuNum() {

return stuNum;

}

public void setStuNum(String stuNum) {

this.stuNum = stuNum;

}

public String getStuName() {

return stuName;

}

public void setStuName(String stuName) {

this.stuName = stuName;

}

public String getCourse() {

return course;

}

public void setCourse(String course) {

this.course = course;

}

public Integer getScore() {

return score;

}

public void setScore(Integer score) {

this.score = score;

}

}

}

复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值