2 回答

TA贡献1785条经验 获得超8个赞
创建流时,您不会直接修改其源。您需要收集数据。您的过滤器似乎按预期工作。我个人不建议使用具有副作用的过滤流(执行“ > 15,然后在其他地方counter
设置”逻辑),但您可以使用另一个流操作来完成,例如(用于转换,这在您的情况下不是必需的,但可以使用):nextSyncDate
peek
map
List<MyObjects> objects = /* omitted */; List<MyObjects> filteredObjects = objects.stream() .peek(MyObjects::setNextSycDateWithSomeLogic()) .filter(obj -> Objects.nonNull(obj.getNextSyncDate()) && obj.getNextSyncDate().before(new Date())) .collect(Collectors.toList());

TA贡献1815条经验 获得超13个赞
过滤器counter还可以包含以下要求:
final Date TODAY = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
final int COUNTER_THRESHOLD = 15;
objects.stream()
.filter(obj -> Objects.nonNull(obj.getNextSyncDate())
&& obj.getNextSyncDate().before(TODAY)
&& obj.getCounter() > COUNTER_THRESHOLD)
过滤器提供的中间流有需要更新的对象,因此可以应用 forEach:
final Date TODAY = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
final Date TOMORROW = Date.from(LocalDate.now().plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
final int COUNTER_THRESHOLD = 15;
objects.stream()
.filter(obj -> Objects.nonNull(obj.getNextSyncDate())
&& obj.getNextSyncDate().before(TODAY)
&& obj.getCounter() > COUNTER_THRESHOLD)
.forEach(obj -> obj.setNextSyncDate(TOMORROW));
另外,请考虑使用 LocalDate 而不是已弃用的 Date。
添加回答
举报