如果过滤值为空,如何跳过流过滤器?

我有一个 Java 对象列表。在数据库中,有些对象有字段nextSyncDate,有些则没有。我想要做的是将过滤器放在java流上,但前提是该字段存在并且例如大于今天的日期。所以简化一下,我想获取nextSyncDate比今天更大的对象和没有此字段的对象(get()在此字段后获取 NullPointException )。

我已经尝试过类似的事情,但它没有像我想要的那样工作..

List<MyObjects> objects;
objects.stream()
    .filter(obj -> Objects.nonNull(obj.getNextSyncDate()) && obj.getNextSyncDate().before(new Date()))

另一方面,所有对象都有 field counter。我想做的另外是nextSyncDate为每个大于 15 的对象进行设置(例如明天)。counter我之前尝试过.map()对象.filter(),但它也不起作用。


饮歌长啸
浏览 88回答 2
2回答

慕的地10843

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

萧十郎

过滤器counter还可以包含以下要求:&nbsp; &nbsp; final Date TODAY = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());&nbsp; &nbsp; final int COUNTER_THRESHOLD = 15;&nbsp; &nbsp; objects.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(obj -> Objects.nonNull(obj.getNextSyncDate())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; && obj.getNextSyncDate().before(TODAY)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; && obj.getCounter() > COUNTER_THRESHOLD)过滤器提供的中间流有需要更新的对象,因此可以应用 forEach:&nbsp; &nbsp; final Date TODAY = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());&nbsp; &nbsp; final Date TOMORROW = Date.from(LocalDate.now().plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());&nbsp; &nbsp; final int COUNTER_THRESHOLD = 15;&nbsp; &nbsp; objects.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(obj -> Objects.nonNull(obj.getNextSyncDate())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; && obj.getNextSyncDate().before(TODAY)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; && obj.getCounter() > COUNTER_THRESHOLD)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .forEach(obj -> obj.setNextSyncDate(TOMORROW));另外,请考虑使用 LocalDate 而不是已弃用的 Date。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java