为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梦里花落0921 2023-06-21 13:38:50
如何使用最少的代码从集合列表中进行比较并检查特定复合条件(&& 不是 ||)是否匹配?例如,我想验证 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 每个过滤器并首先查找来实现它,这看起来非常不整洁和麻烦。
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

有很多方法可以做到这一点。如果主要问题是代码看起来不整洁,我建议将过滤谓词分解到它自己的方法中。那么这只是用该谓词进行调用的问题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));

    }

}


查看完整回答
反对 回复 2023-06-21
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您可以结合使用Predicate,创建易于维护的谓词集合,然后按以下方式应用所有谓词:


@Test

public void filterCollectionUsingPredicatesCombination(){


    List<Predicate<MyObject>> myPredicates = new ArrayList<Predicate<MyObject>>();

    myPredicates.add(myObject -> myObject.myString.startsWith("prefix"));

    myPredicates.add(myObject -> myObject.myInstant.isBefore(Instant.now()));        

    myPredicates.add(myObject -> myObject.myInt > 300);


    List<MyObject> result = myData.stream() // your collection

      .filter(myPredicates.stream().reduce(x->true, Predicate::and)) // applying all predicates

      .collect(Collectors.toList());


    assertEquals(3, result.size()); // for instance

}


查看完整回答
反对 回复 2023-06-21
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信