【问题标题】:How to check if a value is present in the list of map using Java8 Stream如何使用Java 8 Stream检查地图列表中是否存在值
【发布时间】:2022-01-17 20:08:47
【问题描述】:

我有以下userList 类型的List<Map<String, Object>> json 数组

[
  {
    "type": "OWNER",
    "address": "xxxxxxx"
  },
  {
    "type": "LOCATION",
    "address": "sssssss"
  }
  :
]

我想查找列表中的任何地图对象是否包含类型值为 "OWNER" 或 "ADMIN"。我试过他下面的代码

List<String> ownerList = new ArrayList<>();
ownerList.add("OWNER");
ownerList.add("ADMIN");

AtomicBoolean isUserOwner = new AtomicBoolean(false);

userList.forEach(user -> isUserOwner.set(user.entrySet()
                    .stream()
                    .filter(m -> m.getKey().contains("type"))
                    .anyMatch(map -> ownerList.contains(valueOf(map.getValue())))));

isUserOwner.get();// ---> get the boolean value which shows if it is either OWNER or ADMIN

上面的代码工作正常,但是谁能告诉我流中是否有其他方法可以有效地检查这个

【问题讨论】:

  • 上面的代码与列表中负责setting 变量值的最后一个映射一起工作正常。如果是这种情况,您实际上不需要遍历所有Maps。 boolean isUSerOwner = userList.get(userList.size()-1).entrySet() .stream() .filter(m -&gt; m.getKey().contains("type")) .anyMatch(map -&gt; ownerList.contains(String.valueOf(map.getValue()))); 之类的东西另外,using a Set&lt;String&gt; ownerList 会有所帮助,

标签: list dictionary java-8 stream


【解决方案1】:

如果您只需要查找其中一个元素是所有者还是管理员,则可以使用:

boolean containsOwnerOrAdmin = users.stream()
          .map(a -> a.get("type"))
          .filter(Objects::nonNull)
          .anyMatch(type -> ("OWNER".equals(type) || "ADMIN".equals(type)));

此循环遍历列表中的每个映射,获取键为“type”的项目,并将过滤掉任何空值,然后检查任何结果对象是否等于 OWNER 或 ADMIN。

【讨论】:

    【解决方案2】:

    您可以改为这样做。

    userList.forEach(user -> isUserOwner.set(user.entrySet()
                        .stream()
                        .filter(m -> m.getKey().contains("type") && ownerList.contains(m.get("type")))
                        .findAny()
                        .isPresent()
    );
    

    m.get() 是安全的,因为 && 的 RHS 仅在 LHS 为真时才被评估。

    【讨论】:

    • 有什么办法可以去掉 AtomicBoolean
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2023-03-28
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多