java - 使用 Java8 Stream 如果存在则获取 String 值,如果不存在则获取 null

标签 java collections java-8 java-stream filtering

我有一个类似如下所示的 json。需求是根据id获取key值。 IE。假设如果 Id 是 A1,键值应该返回 2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs。键数组将始终只包含一个元素。

{
  "keys": [
    {
      "id": "A1",
      "key": [
        "2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs"
      ]
    },
     {
      "id": "A2",
      "key": [
        "swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew"
      ]
    },
     {
      "id": "A3",
      "key": [
        "EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2"
      ]
    }
  ]
}

为了实现上述内容,我使用 Java8 Stream 编写了以下代码,但问题是它返回 Optional<KeyDetails>我再次需要解析并获取键值

String keyDetails = "{\"keys\":[{\"id\":\"A1\",\"key\":[\"2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs\"]},{\"id\":\"A2\",\"key\":[\"swKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sfsf2dew\"]},{\"id\":\"A3\",\"key\":[\"EyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3Mubdwe2\"]}]}";
AccessKeys accessKeys = new ObjectMapper().readValue(keyDetails, AccessKeys.class);
Optional<KeyDetails> filteredKey = accessKeys.getKeys().stream().filter(key-> key.getId().equals("A3")).findAny();
if(filteredKey.isPresent()) {
    String keyValue = filteredKey.get().getKey().get(0);
    System.out.println("keyValue==>"+keyValue);
}

我想要的是得到Optional<String>而不是 Optional<KeyDetails> .即如果存在 id,它应该只返回键数组中存在的键值。

json 满足的一些条件是:

  • 有时可能会出现重复键 ID 的情况,在这种情况下,它应该只选择一个(第一个)
  • 键数组总是包含一个字符串值

谁能帮我解决这个问题

最佳答案

Sometimes there can be a situation for duplicate key id, in that case it should pick only one (first one)

您正在寻找 map 方法(进行转换)和 findFirst 而不是 findAny 以始终保证返回第一个匹配项。

accessKeys.getKeys()
          .stream()
          .filter(key-> key.getId().equals("A3"))
          .findFirst()
          .map(e -> e.getKey().get(0)).orElse(null);

findAny,顾名思义,应该在您不关心返回哪个匹配项的情况下使用。是的,findFirstfindAny 在顺序流中的行为相同,但我宁愿首先明确我的意图。

关于java - 使用 Java8 Stream 如果存在则获取 String 值,如果不存在则获取 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53792275/

相关文章:

java - 在哪里创建 ExecutorServices 以及何时关闭它们

java - 使用模式拆分字符串时结果为空

java - 按下按钮后在另一个面板内打开另一个面板

Scala 2.11 LinkedList 已弃用,我应该使用什么?

Java8 : How volatile field work with lambda

collections - 用于基于谓词排序的库函数

c# - 用 foreach 遍历 Dictionary,这是按什么顺序完成的?

java - 过滤掉 Java 8 流过滤器表达式中的空值,这样就不会引发异常

java - Java 中的多工套接字通信

java - Spring Boot 外部属性文件