过滤搜索Java 8流

时间:2018-04-08 22:51:51

标签: java lambda java-8 java-stream

我正在尝试用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为'Approved',并且创建时间为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或为空,则我的代码返回一个空数组。我不知道如果不通过特定参数,如果没有传递,空或空,我不知道怎么告诉它。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

我建议您创建多个.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 - &gt; Objects.isNull(el.dateTo)|| el.getCreatedDate()。前(el.dateTo)

如果dateTo为null,那么lambda的结果为true。 如果dateTo不为null,则result是dateTo与el.getCreatedDate()

的比较

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