简体   繁体   English

过滤搜索Java 8流

[英]Filter search Java 8 streams

I am trying to write filter function with Java 8 streams to filter by multiple paramaeters. 我正在尝试使用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

If any of the parameters is not passed, I do not want to filter by that parameter. 如果没有传递任何参数,我不想按该参数进行过滤。 For example If I am given createdBy null, intaketype is 'Approved' and createdfrom is 02-04-2017 createdto is 03-03-2018 then i want all approved intakes from the given dates created by all users. 例如,如果为我提供了createdBy为null,摄入类型为“批准”,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());

My code however,returns an empty array if any of the parameters passed is null or empty. 但是,如果传递的任何参数为null或为空,则我的代码将返回一个空数组。 I am not sure how to tell it to not filter by a particular parameters if not passed, empty or null. 我不确定如何告诉它如果未传递,为空或为null,则不按特定参数进行过滤。

Thanks a lot for your help! 非常感谢你的帮助!

I suggest you create multiple .filter(), where you describe logic for one rule. 我建议您创建多个.filter(),在其中描述一个规则的逻辑。 The .filter() rules are with logical AND in the stream, ie if one of the .filter() rules is false, then this will not be processed. .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());

Let's dig into one of the rules: el -> Objects.isNull(el.dateTo) || 让我们深入研究其中一个规则:el-> Objects.isNull(el.dateTo)|| el.getCreatedDate().before(el.dateTo) el.getCreatedDate()。before(el.dateTo)

If dateTo is null, then the result of the lambda is true. 如果dateTo为null,则lambda的结果为true。 if dateTo is not null, then result is the comparison of the dateTo with el.getCreatedDate() 如果dateTo不为null,则结果为dateTo与el.getCreatedDate()的比较

If the .filter() is false, then this record will be filtered and not proccessed down the stream. 如果.filter()为false,则此记录将被过滤,并且不会继续向下处理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM