MultiValueMap Lambda Issue - PullRequest
       2

MultiValueMap Lambda Issue

0 голосов
/ 27 мая 2018

Я недавно перешел с php на java, поэтому мои навыки работы с Java довольно низкие.

В моем коде я получил MultiValueMap с именем queryParams

MultiValueMap<String, String> queryParams;

Пример значения может быть {matchedMe=[11,22]}

Обязательно, мне нужно получить список [11,22] для установки в переменную listOfIds, поэтому я написал код ниже.

List<String> listOfIds = null;  
queryParams.forEach((k, v)->{               
        if(k.equals("matchedMe")){
            listOfIds =  v;
        }               
    }
);

Проблема: получение ошибок: lambda локальная переменная просматриваемых идентификаторов, определенных в прилагаемой области видимости, должна быть окончательной или эффективной.

Вопросы

  1. Как решить эту проблему?

  2. Каким будет минимальный код, если мне нужен список, а не список из MultiValueMap queryParams;

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

Вы можете напрямую использовать метод getOrDefault или get

List<String> listOfIds = queryParams.getOrDefault("matchedMe", emptyList());

Поскольку MultiValueMap<K, V> расширяется Map<K, List<V>>, Вы можете напрямую использовать методы, определенные для интерфейса Map

0 голосов
/ 28 мая 2018

Попробуйте,

final List<String> paramList = queryParams.entrySet().stream()
        .filter(entry -> entry.getKey().equals("matchedMe")).map(entry -> entry.getValue()).findFirst()
        .orElse(null);
0 голосов
/ 27 мая 2018

В lambda, как и в любых анонимных классах, вы не можете присвоить новое значение свойству за пределами lambda.listOfIds является (на самом деле) окончательным, но в Java 8 это ключевое слово не является обязательным для компилятора, хотя правило остается тем же.

Вы можете просто вызвать значение:

List<String> listOfIds = queryParams
.getOrDefault("matchedMe",Collections.emptyList()); // will return values, or empty List (to prevent null values)

или

List<String> listOfIds = queryParams.entrySet().stream()
.filter((k,v)-> "matchedMe".equals(k)) // filter by key
.findFirst()
.map(Map.Entry::getValue) // return if value exists
.orElse(Collections.emptyList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...