【问题标题】:Get String value if present or null if not present using Java8 Stream使用 Java8 Stream 如果存在则获取字符串值,如果不存在则获取 null
【发布时间】:2019-05-16 11:10:10
【问题描述】:

我有一个类似如下所示的 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&lt;String&gt; 而不是Optional&lt;KeyDetails&gt;。也就是说,如果 id 存在,它应该只返回键数组中存在的键值。

json 满足的一些条件是:

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

谁能帮我解决这个问题

【问题讨论】:

  • 试试这个accessKeys.getKeys() .stream().filter(key-&gt; key.getId(.equals("A3")).findAny() .map(filteredKey-&gt;filteredKey.getKey().get(0)) .orElse(null);
  • 您的代码似乎符合您的要求,除了您应该使用findFirst 而不是findAny 来保证返回第一项。你有什么问题?这里有什么问题?
  • @HadiJ 感谢您的回答,但如何获得Optional&lt;String&gt; 而不是普通的String
  • @Aomine 其实我想在我的if(filteredKey.isPresent()) 代码中避免filteredKey.get().getKey().get(0);

标签: java collections java-8 java-stream filtering


【解决方案1】:

有时可能会出现重复 key id 的情况,在这种情况下 它应该只选择一个(第一个)

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

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

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

【讨论】:

  • 感谢您的回答,但如何获得Optional&lt;String&gt; 而不是普通的String 作为回报
  • @AlexMan 删除 .orElse(null)
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2017-04-03
  • 2022-01-20
  • 2022-12-15
  • 1970-01-01
  • 2023-03-31
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多