背景:虽然DB中分别存储了begin 和 end 的分数范围,但是每条数据都查一遍库的话,明显不是最好的方法,所以一次性将需要的数据先查询出来,然后再匹配到相应的等级。以下是其中一种解决方案。
使用到google guava。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
<!-- <!– or, for Android: –>-->
<!-- <version>30.1.1-android</version>-->
</dependency>
使用范例:
如下形式
91-100分,[90,100],划分等级A;
81-90分,[80,90),划分等级B;
71-80分,[70,80),划分等级C;
61-70分,[60,70),划分等级E;
0-60分,[0,60),划分等级F;
使用TreeRangeMap
...
List<Integer> scoreList = records.stream().map(Score::getScore).distinct().collect(Collectors.toList());
List<Grade> gradeList = gradeService.listGradeByScore(scoreList);
RangeMap<Integer, String> scoreRangeMap = TreeRangeMap.create();
gradeList.forEach(grade -> scoreRangeMap.put(Range.openClosed(grade.getBeginScore(), grade.getEndScore()), grade.getName()));
records.forEach(record -> record.setGrade(scoreRangeMap.get(record.getScore())));
...
其中Range有很多种集合范围方式,比如[…],[…),(…] 等。