繁体   English   中英

从 yaml 文件过滤属性

[英]Filtering properties from yaml file

我有这个映射到类 T1 的 yaml 文件。

T1:
  apis :
    - api: r1
      cnfig :
        - country: M1
          usersegment: 5|6|10
        - country: M2
          usersegment: 10|11
     - api: r2
      cnfig :
        - country: M1
          usersegment: 5|6|10|11
        - country: M2
          usersegment: 10|11

我需要对国家M1 usersegment5所有 api 进行罚款。 所以对于上面的输入,我应该得到r1r2都具有完整的配置细节。 对于用户usersegment 11和国家M1我应该只得到r2

我尝试在 java 中使用流做同样的事情:

masterConfig.getConfig("tv").getApis()
    .stream()
    .filter(api -> api.Configs().stream()
        .filter(singleConfig -> singleConfig.usersegment.contains("5") && 
            country.equals("M1"))
        .count() > 0)
    .count()

每次它都显示相同的计数2 我需要获取具有国家/地区的所有 api 的列表: M1和用户usersegment 5

您能否尝试以下代码段:

        List<Api> collect = apis
                .stream().filter(
                        api -> (api.getConfigs().stream()
                                .filter(singleConfig -> singleConfig.usersegment.contains("11")
                                        && singleConfig.country.equals("M1"))
                                .count() > 0))
                .collect(Collectors.toList());

(请注意,我已经创建了自定义对象来模拟问题。)

最好使用Stream::anyMatch作为过滤器方法中Predicate的返回值。 这种短路方法的优点是,一旦发现第一个元素符合条件并返回true ,流就会停止对元素进行迭代。

List<Api> apiList = apis
    .stream()
    .filter(api -> api.getConfigs().stream()
            .anyMatch(
                singleConfig -> singleConfig.usersegment.contains("11") && 
                singleConfig.country.equals("M1")))
    .collect(Collectors.toList());

此外,应使用singleConfig.country.equals("M1")

暂无
暂无

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

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