Как конвертировать Список POJO в Картув потоке Java? - PullRequest
3 голосов
/ 20 сентября 2019

Я хочу преобразовать Список Java POJO в Карту нестатическим методом с Java 8 Stream API.

Моей линейной диаграмме нужен список значений даты String для оси x и списокчисловые значения для оси y.Это типичный формат карты.Но моя база данных возвращает список POJO для меня.Я чувствую неприязнь к зацикливанию без помощи Java 8 Stream API.Я попробовал метод в этом [ask} ( Java 8 Список объектов для отображениязначений ).Тем не менее, я столкнулся с двумя проблемами. Во-первых, мой POJO MoreCustomDTO содержит целое число помимо String.Во-вторых, когда я пытаюсь использовать ссылку на метод, IDEA жалуется на то, что на статический метод нельзя ссылаться из статического контекста.

POJO:

@Data
MoreCustomDTO {
    private String date;
    private Integer money;
}

Метод запроса DAO:

public List<MoreCustomDTO > getMoreCustomCount(@Param("format") String format, @Param("startTime") String startTime, @Param("endTime") String endTime);

Решение до Java 8:

List<MoreCustomCountDTO> customList = customDao.getMoreCustomCount(SqlUtils.DATE_TYPE_FORMAT[Integer.valueOf(type)],startTime,endTime);
Map<String, List> map = new HashMap();
List<String> dateList = new ArrayList<>();
List<Integer> moneyList = new ArrayList<>();
for (MoreCustomCountDTO data : customList) {
    dates.add(data.getDate());
    dailyAmounts.add(data.getMoney());
}
map.put("date", dateList);
map.put("money", moneyList);

Сегмент кода ошибки:

Map<String,List> map =
                    customList.stream()
                            .flatMap(element -> {
                                Map<String,String> um = new HashMap<>();
                                um.put("date",element.getDate());
                                um.put("money",element.getMoney());
                                return um.entrySet().stream();
                            })
                            .collect(Collectors.groupingBy(Map.Entry::getKey,
                                    Collectors.mapping(Map.Entry::getValue,
                                            Collectors.toList())));

Я получаю список из своей базы данных.И это массив объектов в формате JSON.

ответ:

{
  "rows": [
    {
      "date": "2019-09-01",
      "money": 0.00
    },
    {
      "date": "2019-09-02",
      "money": 0.00
    }
  ]
}

Но я хочу формат карты один (ключ) ко многим (значениям).

ответ:

{
  "map": {
    "date": [
      "2019-09-01",
      "2019-09-02"
    ],
    "money": [
      0.00,
      0.00
    ]
  }
}

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Честно говоря, я думаю, ваше первоначальное решение было в порядке.Иногда принуждение к реализации решения с использованием самых причудливых возможностей языка приводит к менее понятному коду, что всегда плохо.

Сказав это, я думаю, что вы намеревались сделать что-то вроде:

Map<Object, Object> map = Stream.of(
    new SimpleEntry<>(
      "date",
      customList.stream().map(MoreCustomDTO::getDate).collect(Collectors.toList())
    ),
    new SimpleEntry<>(
      "money",
      customList.stream().map(MoreCustomDTO::getMoney).collect(Collectors.toList())
    )
  ).collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue));

0 голосов
/ 20 сентября 2019

вместо этого используйте SimpleEntry:

Map<String, List<Object>> map= customList.stream().
                flatMap(element -> 
                        Stream.of(new AbstractMap.SimpleEntry<String, Object>("date", element.getDate()),
                                new AbstractMap.SimpleEntry<String, Object>("money", element.getMoney()))).
                collect(Collectors.groupingBy(AbstractMap.SimpleEntry::getKey, Collectors.mapping(AbstractMap.SimpleEntry::getValue, Collectors.toList())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...