java - 在 map 中查找不在 pojo 列表中的值

标签 java java-stream

在我的 REST api 中,我正在接受一个看起来像这样的 map -

Map<String, Object> newSettings -

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

我需要将这些设置与现有设置列表进行比较。该列表看起来像这样 -

List<Setting> currentSettings -

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

这是设置对象的样子 -

public class Setting {
    private String settingName;

    private String settingValue;

    // getters and setters ...

我试图弄清楚如何找到发送到 REST api 的 map 中不在设置列表中的条目。在上面的例子中,它应该是“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())
                    )
            );

注意:与上一个相比,我不确定它的性能。

关于java - 在 map 中查找不在 pojo 列表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60840714/

相关文章:

java - 将 long 列表转换为 double 列表

lambda - 收集后获取java8上的索引

java - 是否可以同步 if block 的一半?

java - 将应用程序部署到 heroku 时出错(spring boot)

Java MD5 哪一个是正确的?

java - 流减少不正确地使用长类型

Java 8 ConcurrentHashMap 初始化

java - 应用比较器和谓词的顺序重要吗?

java - 如何从 Firebase 数据库检索纬度和经度到 Android map 应用程序

java - 通过 XSLT 编码到 HTML 表中的 JAXB 包含空值