簡體   English   中英

在地圖中查找不在 pojo 列表中的值

[英]Find values in a map that ARE NOT in a list of pojos

在我的 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 ...

我試圖弄清楚如何找到發送到 REST api 的地圖中的條目,這些條目不在設置列表中。 在上面的例子中,應該是“hasRegistered”。

到目前為止我嘗試過的一切都沒有奏效。 誰有想法?

你可以這樣做:

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

注意:與前一個相比,我不確定它的性能。

首先,您可以通過以下方式獲取 newSettings 的所有鍵:

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


    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM