В java8 Collectors.toMap значение keyMapper должно исходить из ключа другой константной карты - PullRequest
0 голосов
/ 26 мая 2018

У меня такая ситуация:

В моем проекте я использую весеннюю загрузку с данными о пружине. Поэтому сейчас мне нужно отфильтровать основную сущность по различным полям.Поля и их значения поступают в формате json в теле запроса при последующем вызове следующим образом.

{
  "filters": [
    {
      "field": "ownerUiids",
      "terms": "1,2"
    },
    {
      "field": "key",
      "terms": "a"
    },
    {
       and many more
    }
  ],
  "sortBy": "wwww"
}

У меня есть класс pojo для преобразования этого json в java.и в этом классе pojo содержится список полей, поступающих изjson.

Я преобразовал этот список в карту поля и его значение в качестве ключа и значения, например:

Map<String,String> filterMap =
            request.getFilters().stream().collect(Collectors.toMap(Filter::getField,
                    Filter::getTerms));

Так что моя проблема начинается здесь, имя поля в json не совпадает с моим столбцомname в db, поэтому при определении критериев api фактическое имя столбца не появляется при создании запроса.

Чтобы решить эту проблему, я создал постоянную статическую карту с ключом в качестве поля json, а значением является фактическое имя столбца, соответствующее этому полюкак:

public static final Map<String, String> myMap = Collections.unmodifiableMap(
            new HashMap<String, String>() {{
                put("ownerUiids", "ownerUIID");
                put("key", "keyValue");
            }});

Так что, когда я делаю filterMap, мне нужно, чтобы ключ был значением константы myMap, т.е. вместо Filter :: getField, если я могу сделать myMap.getKey (Filter :: getField).Но сейчас я не могу так поступить.

Map<String,String> filterMap =
                request.getFilters().stream().collect(Collectors.toMap(myMap.getKey(Filter::getField),
                        Filter::getTerms));

После этого у меня есть карта имени столбца и его значение, которое является моим текущим требованием.а также решить мою проблему.

Пожалуйста, помогите мне в этом sol.или если у вас есть лучший подход, чем этот, то это также заметно.

Ответы [ 2 ]

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

по причине создания класса dto и форматирования необработанных данных

1: создание метода преобразования dto и записи в классе dto

List<Dto> dtos = request.getFilters().stream().map(Dto::convert).collect(Collectors.toList())

2: и теперь создание карты

Map<String,String> filterMap = dtos.stream().collect(Collectors.toMap(Dto::getField,Dto::getTerms))
0 голосов
/ 26 мая 2018

Вы не можете использовать такую ​​ссылку на метод.Попробуйте это:

Map<String,String> filterMap =
       request.getFilters().stream()
              .collect(Collectors.toMap(f -> myMap.get(f.getField()),
                    Filter::getTerms));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...