过滤器搜索 Java 8 流



我正在尝试使用 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,则摄入量类型为"已批准",并且创建自是 02-04-2017 创建为 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());

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

非常感谢您的帮助!

我建议你创建多个 .filter((,在其中描述一个规则的逻辑。.filter(( 规则在流中带有逻辑 AND,即如果其中一个 .filter(( 规则为 false,则不会处理。

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 为空,则 lambda 的结果为真。如果 dateTo 不为 null,则结果是 dateTo 与 el.getCreatedDate(( 的比较

如果 .filter(( 为 false,则此记录将被过滤,而不是沿流向下处理。

最新更新