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

标签 java list java-stream

我有一个 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/

相关文章:

java - Hibernate Jsp Servlet 注册表单不起作用

java - 在 Java 8 中,我可以使用流来过滤部分字符串吗?

linux - 如何列出某个目录中两个时间戳之间的文件? (太阳操作系统)

java - Java 中的类型 List 与类型 ArrayList

Java 8 函数式接口(interface),无参数,无返回值

java - 按列表中的单词拆分没有空格的文本

java - ThreadLocal 线程安全吗?

java - Tomcat 中的环境变量

java - 使用正则表达式进行Elasticsearch Java API搜索

python - 如何避免在 python 程序的输出中打印 None 列表