如何使用 Java8 Stream 检查地图列表中是否存在值

How to check if a value is present in the list of map using Java8 Stream

我有以下 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

上面的代码工作正常,但是任何人都可以告诉我流中是否有任何其他方法可以有效地检查它

您可以改为执行类似的操作。

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 为真时才计算。

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

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

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