我有一个 Java 对象列表。在数据库中,有些对象有字段nextSyncDate
,有些则没有。我想要做的是将过滤器放在java流上,但仅当此字段存在并且例如大于今天的日期。所以简化一下,我想获取 nextSyncDate
大于今天的对象以及没有此字段的对象(在此字段上的 get()
之后获取 NullPointException)。
我已经尝试过类似的方法,但它没有像我想要的那样工作..
List<MyObjects> objects;
objects.stream()
.filter(obj -> Objects.nonNull(obj.getNextSyncDate()) && obj.getNextSyncDate().before(new Date()))
另一方面,所有对象都有字段counter
。我还想做的是为 counter
大于 15 的每个对象设置 nextSyncDate
(例如明天)。我尝试 .map()
对象在 .filter()
之前,但它也不起作用。
最佳答案
创建流时,您不会直接修改其源。您需要收集数据。您的过滤器似乎按预期工作。我个人不建议使用具有副作用的过滤流(执行“counter
> 15,然后在其他地方设置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());
关于java - 如果过滤值为空,如何跳过流过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58200874/