Фильтрация свойств из файла yaml - PullRequest
1 голос
/ 09 января 2020

У меня есть файл yaml, который сопоставлен с классом T1.

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

Мне нужно штрафовать все apis, где usersegment равно 5 для страны M1. Так что для вышеупомянутого ввода я должен получить r1 и r2 оба с полными деталями конфигурации. И для 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

Ответы [ 2 ]

1 голос
/ 09 января 2020

Не могли бы вы попробовать следующий фрагмент:

        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());

(обратите внимание, что я создал пользовательские объекты для имитации проблемы.)

0 голосов
/ 13 января 2020

Лучше использовать 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") должны быть использованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...