如何定义地图,其中键是日期,值是列表

时间:2018-11-28 08:37:37

标签: java spring spring-boot spring-data-jpa

我需要定义地图,其中键是一天,值是帖子列表。在RequestMapping中,我给出/{year}/{month}/{day},但是day是可选的。如何定义map并将其返回给json以获取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 :(得分:2)

逻辑就是这样,  检查地图中是否存在日期(密钥)。

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) );
 }

答案 1 :(得分:1)

使用Java 8可以以更短的形式实现类似。

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

另外一种方法是POST类的getDay方法或其他获取日期的方法:

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

两种方法都可以正常工作。第二个更加精确和声明性。