Найти значения на карте, которых нет в списке pojos - PullRequest
3 голосов
/ 25 марта 2020

В моем REST API я принимаю карту, которая выглядит следующим образом -

Map<String, Object> newSettings -

{
  "showGrantsInGrid": false,
  "isPrimeUser": true,
  "hasRegistered": true
}

Мне нужно сравнить эти настройки с существующим списком настроек , Этот список выглядит так -

List<Setting> currentSettings -

[
  {
    "settingName": "showGrantsInGrid",
    "settingValue": "false",
  },
  {
    "settingName": "isPrimeUser",
    "settingValue": "true",
  }
]

Вот как выглядит объект Setting -

public class Setting {
    private String settingName;

    private String settingValue;

    // getters and setters ...

Я пытаюсь выяснить как найти записи в карте, которые были отправлены в API REST, которых нет в списке настроек. В приведенном выше примере это должно быть «hasRegistered».

Все, что я пробовал до сих пор, не работает. У кого-нибудь есть идеи?

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Вы можете сделать так:

Set<String> settingNames = currentSettings.stream()
          .map(Setting::getSettingName)
          .collect(Collectors.toSet());

затем

newSettings.keySet().stream()
           .filter(key->!settingNames.contains(key))
           .collect(Collectors.toList());

За один шаг:

currentSettings.stream()
            .collect(Collectors
                    .collectingAndThen(Collectors
                                    .mapping(Setting::getSettingName, Collectors.toSet()),
                         settingName -> newSettings.keySet().stream()
                              .filter(key -> !settingName.contains(key))
                              .collect(Collectors.toList())
                    )
            );

Примечание: я не уверен в его производительности по сравнению с предыдущим.

0 голосов
/ 25 марта 2020

Во-первых, вы можете получить все ключи новых настроек с помощью:

    List<String> newOnes = new ArrayList<>(); 

    Set<String> keys = newSettings.keySet();
    for (String key: keys) {
        // then, search through the list to see if it contains that name
        boolean present = false;
        for (Setting setting : currentSettings) {
             if (setting.getSettingName().equals(key)) {
                 present = true;
                 break;
             }
}
        if (!present) 
            newOnes.add(key);


    }
...