猿问

如何使用多个条件从集合列表中过滤

如何使用最少的代码从集合列表中进行比较并检查特定复合条件(&& 不是 ||)是否匹配?


例如,我想验证 startDateObj=2019-08-27, timeCode=A 和 endDateObj=2019-08-28, timeCode=D 是否同时存在于响应列表中。


我有以下课程


ResponseVo {

    List<DateTimeVo> dateTimeObj;

}


DateTimeVo {

    String dateObj;

    List<TimeVo> timeList;

}


TimeVo {

    String code;

    String displayInformation;

}

示例输出


{

    "dateTimeObj": [

        {

            "dateObj": "2019-08-27",

            "timeList": [

                {

                    "code": "A",

                    "displayInformation": "Do A Act"

                },

                {

                    "code": "B",

                    "displayInformation": "Do B Act"

                }

            ]

        },

        {

            "dateObj": "2019-08-28",

            "timeList": [

                {

                    "code": "C",

                    "displayInformation": "Do C Act"

                },

                {

                    "code": "D",

                    "displayInformation": "Do D Act"

                }

            ]

        }

    ]

}

目前,我已经通过调用可选的 post 每个过滤器并首先查找来实现它,这看起来非常不整洁和麻烦。


梦里花落0921
浏览 121回答 2
2回答

牛魔王的故事

有很多方法可以做到这一点。如果主要问题是代码看起来不整洁,我建议将过滤谓词分解到它自己的方法中。那么这只是用该谓词进行调用的问题Stream.anyMatch。例如:public class ResponseVo {    public static void main(String[] args) {        ResponseVo response = ... // Obtain response        boolean anyMatch = response.dateTimeObj            .stream().anyMatch(dtvo -> exists(dtvo, "2019-08-27", "A"));    }    List<DateTimeVo> dateTimeObj;    private static boolean exists(DateTimeVo dtvo,         String date, String code) {        return dtvo.dateObj.equals(date) &&             dtvo.timeList.stream().anyMatch(tvo -> tvo.code.equals(code));    }}

素胚勾勒不出你

您可以结合使用Predicate,创建易于维护的谓词集合,然后按以下方式应用所有谓词:@Testpublic void filterCollectionUsingPredicatesCombination(){&nbsp; &nbsp; List<Predicate<MyObject>> myPredicates = new ArrayList<Predicate<MyObject>>();&nbsp; &nbsp; myPredicates.add(myObject -> myObject.myString.startsWith("prefix"));&nbsp; &nbsp; myPredicates.add(myObject -> myObject.myInstant.isBefore(Instant.now()));&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; myPredicates.add(myObject -> myObject.myInt > 300);&nbsp; &nbsp; List<MyObject> result = myData.stream() // your collection&nbsp; &nbsp; &nbsp; .filter(myPredicates.stream().reduce(x->true, Predicate::and)) // applying all predicates&nbsp; &nbsp; &nbsp; .collect(Collectors.toList());&nbsp; &nbsp; assertEquals(3, result.size()); // for instance}
随时随地看视频慕课网APP

相关分类

Java
我要回答