Преобразование Nested For Loop в Lambda и сравнение карт - PullRequest
4 голосов
/ 08 ноября 2019

Я изо всех сил пытаюсь преобразовать существующий forloop в лямбда-выражение. У меня есть список объектов (List<Task>), который содержит карту с именем 'InputData' (Map<String, String>). У меня также есть еще Map<String, String> (Принятие).

Я хочу отфильтровать список объектов Task, в котором карта Task.InputData содержит все записи карты «Acceptance». Task.InputData может содержать дополнительные записи, но я хочу, чтобы переменные, которые существуют в Acceptance, должны существовать в Task.InputData.

Существующий цикл for выглядит следующим образом:

boolean addTask;
List<Task> finalResults = new ArrayList<>();
for (Task t : results) {
      addTask = true;
      for (Entry<String, String> k : kvVars.entrySet()) {                
            if (!t.getInputData().containsKey(k) || !t.getInputData().get(k).equals(k.getValue())) {
                  addTask = false;
            }
      }

      if (addTask) {
            finalResults.add(t);
      }
}

I 'Я немного озадачен подходом, должен ли я пытаться объединить критерии плоской карты и фильтра или мне следует следовать логике в существующем цикле for.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Вы можете использовать filter, чтобы собрать все Task, которые имеют все 'Acceptance' k / v в InputData

List<Task> finalResults = results.stream()
                                 .filter(t->kvVars.entrySet()
                                                  .stream()
                                      .allMatch(k->t.getInputData().containsKey(k.getKey()) 
                                                   && t.getInputData().get(k.getKey()).equals(k.getValue()))
                                 .collect(Collectors.toList());
1 голос
/ 08 ноября 2019

Вы можете использовать Set.containsAll на наборе ввода карты входных данных, чтобы проверить ваше состояние:

List<Task> finalResults = results.stream()
        .filter(t -> t.getInputData().entrySet().containsAll(kvVars.entrySet()))
        .collect(Collectors.toList());
...