使用Java8 Stream获取String值(如果存在)或null(如果不存在)

时间:2018-12-15 12:19:05

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

我有一个类似如下所示的json。要求是根据id获取键值。即。可以说如果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,在这种情况下,它应该只选择一个(第一个)
  • 键数组将始终包含一个字符串值

有人可以帮我吗

1 个答案:

答案 0 :(得分:4)

  

在某些情况下,有时可能会出现重复的键ID   它应该只选择一个(第一个)

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

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

findAny应该用于您不关心返回哪个匹配项的情况。是的,findFirstfindAny在顺序流中的作用相同,但我首先要明确我的意图。