【问题标题】:Filter search Java 8 streams过滤搜索 Java 8 流
【发布时间】:2018-04-08 22:51:50
【问题描述】:

我正在尝试使用 Java 8 流编写过滤器函数以按多个参数进行过滤。

createdFrom - Date (mm-dd-yyyy) // if null, filter without createddate From
createdTo - Date - (mm-dd-yyyy) // if null, filter without createddate to
CreatedBy - String //if null, filter without createdby
Intaketype - List<String> // if empty, filter with all intaketypes

如果没有传递任何参数,我不想按该参数进行过滤。例如,如果给我 createdBy null,intaketype 是“已批准”,createdfrom 是 02-04-2017 createdto 是 03-03-2018,那么我想要所有用户创建的给定日期的所有已批准摄入量。

List<Intake> intakes= intakeservice.getAllintakes.stream()
        .filter(el -> intaketype.getIntaketype.contains(el.getIntaketype())
                    && intaketype.getCreatedBy.contains(el.getCreatedBy())
        && el.getCreatedDate().before(el.dateTo)
        && el.getCreatedDate().after(el.dateFrom))
        .collect(Collectors.toList());

但是,如果传递的任何参数为空或为空,我的代码将返回一个空数组。我不知道如何告诉它如果未通过、为空或为空,则不按特定参数进行过滤。

非常感谢您的帮助!

【问题讨论】:

  • "例如 if createdBy if null" - 你能提供一个更好的例子吗?
  • 如果给我 createdBy null,intaketype 是“已批准”,createdfrom 是 02-04-2017 createdto 是 03-03-2018,那么我想要所有用户创建的给定日期的所有已批准摄入量。
  • 这与流无关。如果它是一个普通的if,你显然会这样做,例如intakeType.getCreatedBy() == null || intakeType.getCreatedBy().contains(el.getCreatedBy())。这里也一样。
  • @LouisWasserman 它实际上不起作用...我现在得到一个空数组..
  • 那么你需要调试你的逻辑。同样:这与流无关,仅与正确编写逻辑以检查 null 并适当响应有关。

标签: java lambda java-8 java-stream


【解决方案1】:

我建议您创建多个 .filter(),在其中描述一条规则的逻辑。 .filter() 规则在流中是逻辑与,即如果 .filter() 规则之一为假,则不会处理。

List<Intake> intakes= intakeservice.getAllintakes.stream()
    .filter(el -> Objects.isNull(el.dateTo) || el.getCreatedDate().before(el.dateTo))
    .filter(el -> Objects.isNull(el.dateFrom) || el.getCreatedDate().after(el.dateFrom))
    .filter(el -> Objects.isNull(el.getCreatedBy) || intaketype.getCreatedBy.contains(el.getCreatedBy()))
    .filter(el -> Objects.isNull(el.getIntaketype) || el.getIntaketype.size == 0 || intaketype.getIntaketype.contains(el.getIntaketype())
    .collect(Collectors.toList());

让我们深入研究其中的一条规则: el -> Objects.isNull(el.dateTo) || el.getCreatedDate().before(el.dateTo)

如果 dateTo 为 null,则 lambda 的结果为真。 如果 dateTo 不为 null,则 result 是 dateTo 与 el.getCreatedDate() 的比较

如果 .filter() 为 false,则此记录将被过滤,不会在流中向下处理。

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多