Получить значение String, если оно присутствует, или NULL, если его нет, используя Java8 Stream - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть JSON, как показано ниже.Требуется получить значение ключа на основе идентификатора.то есть.Допустим, если Id равен A1 , значение ключа должно возвращаться 2gAwIBAgIQKGZsKfAUzaJHVantyrwVdzANBgkqhkiG9w0BAQs .Массив ключей всегда будет содержать только один элемент.

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

Для реализации вышеприведенного кода я написал приведенный ниже код с использованием потока Java8, но проблема в том, что он возвращает 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>.то есть, если идентификатор присутствует, он должен возвращать только значение ключа, которое присутствует в массиве ключей.

Некоторые условия, которым удовлетворяет json, были:

  • Иногда может возникнуть ситуациядля дублированного идентификатора ключа, в этом случае он должен выбрать только один (первый)
  • Массив ключей всегда будет содержать одно строковое значение

Может кто-нибудь, пожалуйста, помогите мне в этом

1 Ответ

0 голосов
/ 15 декабря 2018

Иногда может возникнуть ситуация с дублированием идентификатора ключа, в этом случае следует выбрать только один (первый)

Вы ищете метод map (дляtransform) и findFirst вместо findAny, чтобы всегда гарантировать возвращение первого совпадения.

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

findAny, как следует из названия, следует использовать в тех случаях, когда вам все равно, какиеСоответствующий элемент возвращается.Да, и findFirst, и findAny будут действовать одинаково в последовательном потоке, но я бы лучше прояснил свое намерение в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...