如何使用Stream API计算员工Review集合中Byte评分的Double类型平均值
解决方案
前置注意事项
- 因为
Employee实体的reviews关联配置为FetchType.LAZY懒加载,计算前请确保代码运行在持久化上下文环境中,否则会抛出懒加载异常 - 下方代码做了全链路空值防护,兼容
reviews为null、集合中存在null的Review对象、grade字段为null的各类边界场景
代码实现
你可以直接在Employee类中添加获取平均评分的方法:
import java.util.Objects; import java.util.OptionalDouble; @Entity public class Employee extends AbstractBaseEntity { @OneToMany( mappedBy = "employee", cascade = CascadeType.MERGE, fetch = FetchType.LAZY) private List<Review> reviews; // 新增获取平均评分方法 public Double calculateAverageGrade() { if (this.reviews == null || this.reviews.isEmpty()) { // 无有效评分时的返回值可根据业务需求调整,也可以返回null return 0.0; } OptionalDouble averageOpt = reviews.stream() // 过滤集合中为null的Review对象 .filter(Objects::nonNull) // 提取评分字段 .map(Review::getGrade) // 过滤为null的评分值 .filter(Objects::nonNull) // 转为数值流计算平均值 .mapToDouble(Byte::doubleValue) .average(); // 无有效评分时的兜底返回,可根据业务调整 return averageOpt.orElse(0.0); } // 原有getter、setter }
如果业务要求没有有效评分时返回null,将最后一行返回值替换为:return averageOpt.isPresent() ? averageOpt.getAsDouble() : null;
内容的提问来源于stack exchange,提问作者user15599360
相关产品推荐
相关产品推荐

