Java LocalDate.plusDays()失效:训练循环的训练全部添加至同一天
问题根源与解决方案
嘿,这个问题很典型!你遇到的所有训练都被加到同一天的原因,是LocalDate是不可变类——调用plusDays(1)并不会修改原来的localDate对象,而是返回一个新的LocalDate实例,但你没有把这个新实例重新赋值给localDate变量,所以循环里一直用的是最初传入的那个日期。
错误代码的核心问题
看你这段循环逻辑:
if (trainings == null || trainings.isEmpty()) { localDate.plusDays(1); // 仅生成新日期,但未更新变量引用 } else { Day actualDay = getActivityBoardDay(localDate, userId); actualDay.getTrainings().addAll(trainings); localDate.plusDays(1); // 同样未将新日期赋值给变量 days.add(actualDay); }
每次调用localDate.plusDays(1)后,原变量localDate的值完全没变,循环始终使用初始的日期值,自然所有训练都堆在同一天了。
修改后的正确代码
只需要把plusDays(1)的返回值重新赋值给日期变量就行,另外建议复制一份参数日期来避免修改外部传入的原始值:
public List<Day> addTrainingCycle(String userId, TrainingCycle trainingCycle, LocalDate localDate) { List<Day> days = new ArrayList<>(); // 复制参数日期,避免修改外部传入的原始变量 LocalDate currentDate = localDate; for (List<Training> trainings : trainingCycle.getTrainingsForDay()) { if (trainings == null || trainings.isEmpty()) { currentDate = currentDate.plusDays(1); // 赋值更新日期 } else { Day actualDay = getActivityBoardDay(currentDate, userId); actualDay.getTrainings().addAll(trainings); days.add(actualDay); currentDate = currentDate.plusDays(1); // 赋值更新日期 } } return days; }
额外说明
- LocalDate的不可变性:Java中
LocalDate、LocalDateTime这类日期时间类都是不可变设计,所有修改操作都会返回新实例,必须接收返回值才能更新变量。 - 保护原始参数:新增
currentDate变量来承接更新后的日期,是为了避免意外修改方法外部传入的localDate参数,这是更严谨的编码习惯。
这样修改后,每次循环都会正确递增日期,不同组的训练就会被加到对应的天数里啦!
内容的提问来源于stack exchange,提问作者D.Zet
相关产品推荐
相关产品推荐

