Как определить карту, где ключом является день, а значением - список - PullRequest
0 голосов
/ 28 ноября 2018

Мне нужно определить карту, где ключом является день, а значением - Список сообщений.В RequestMapping я даю /{year}/{month}/{day}, но день не обязателен.Как определить карту и вернуть ее в json, чтобы получить json, где дни от 1 до 31, а в днях у меня есть Список объектов, созданных в этот день.Код моего контроллера:

 @RequestMapping(value = "/post/{year}/{month}/{day}", method = RequestMethod.GET)
    public List<Post> getPostsByDate(@PathVariable("year") int year,
                                     @PathVariable("month") int month,
                                     @PathVariable("day") Optional<Integer> day)
   {


        if (day.isPresent()){
            return postRepository.findAllByCreateDate(year, month, day);
        } else return postRepository.findAllByMonthAndYear(year, month);

       List<Post> posts = postRepository.findAllByMonthAndYear(year, month);
       Map<Date, List<Post>> postMap =


   }

и код почтового репозитория:

   @Repository
public interface PostRepository extends JpaRepository<Post, Long> {
    List<Post> findAllByUser(User user);

    @Query("select p from Post p where (year(p.createDate) = ?1 and month(p.createDate) = ?2) order by p.createDate")
    List<Post> findAllByMonthAndYear(int year, int month);

    @Query("select p from Post p where (year(p.createDate) = ?1 and month(p.createDate) = ?2 and day(p.createDate) = ?3) order by p.createDate")
    List<Post> findAllByCreateDate(int year, int month, Optional<Integer> day);



}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Подобное может быть достигнуто в более короткой форме с использованием Java 8.

postMap.computeIfAbsent(day, k -> Collections.emptyList()).add(postObject);

И другой подход, если метод getDay класса POST или какой-то другой метод для получения дня:

Map<Date, List<Post>> postMap = posts.stream().collect(Collectors.groupingBy(Post::getDay));

Оба подхода должны работать нормально.Второй - более точный и декларативный.

0 голосов
/ 28 ноября 2018

Логика выглядит следующим образом: Проверьте, существует ли день (Ключ) на карте.

1), если Да, Получить список сообщений за этот день и добавьте новое сообщение в список

2)Еще Добавить новую запись на дату в карте

if (day.isPresent()){
        return postRepository.findAllByCreateDate(year, month, day);
    } else return postRepository.findAllByMonthAndYear(year, month);

   List<Post> posts = postRepository.findAllByMonthAndYear(year, month);
   Map<Date, List<Post>> postMap = new HashMap();

 if(postMap.contains()){
    //Add record to list for day key
    postMap.put(day,postMap.get(day).add(postObject) ); 
  }else{
     //Add new entry for day
     List<Post> posts = new ArrayList();
     posts.add(postObject);
     postMap.put(day,postMap.get(day).add(posts) );
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...