Java 如何定义地图,其中键为天,值为列表

Java 如何定义地图,其中键为天,值为列表,java,spring,spring-boot,spring-data-jpa,Java,Spring,Spring Boot,Spring Data Jpa,我需要定义地图,其中键是一天,值是帖子列表。在RequestMapping中,我给出了/{year}/{month}/{day},但是day是可选的。如何定义映射并将其返回到json以获取json,其中天是从1-31到天,我已经在这一天创建了对象列表。我的控制器代码: @RequestMapping(value = "/post/{year}/{month}/{day}", method = RequestMethod.GET) public List<Post> getP

我需要定义地图,其中键是一天,值是帖子列表。在RequestMapping中,我给出了
/{year}/{month}/{day}
,但是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 =


   }
@RequestMapping(value=“/post/{year}/{month}/{day}”,method=RequestMethod.GET)
公共列表getPostsByDate(@PathVariable(“年”)int year,
@路径变量(“月”)整月,
@路径变量(“日”)可选日)
{
如果(day.isPresent()){
return postRepository.findAllByCreateDate(年、月、日);
}否则返回postRepository.findAllByMonthAndYear(年,月);
List posts=postRepository.findAllByMonthAndYear(年,月);
地图邮戳=
}
和发布存储库代码:

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



}
@存储库
公共接口PostRepository扩展了JpaRepository{
列出findAllByUser(用户);
@查询(“从Post p中选择p,其中(年(p.createDate)=?1,月(p.createDate)=?2)按p.createDate排序”)
列出findAllByMonthAndYear(整数年,整数月);
@查询(“从Post p中选择p,其中(年(p.createDate)=?1,月(p.createDate)=?2,天(p.createDate)=?3)按p.createDate排序”)
列出findAllByCreateDate(整数年、整数月、可选日期);
}
逻辑是这样的, 检查地图中是否存在日期(键)

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) );
 }
if(day.isPresent()){
return postRepository.findAllByCreateDate(年、月、日);
}否则返回postRepository.findAllByMonthAndYear(年,月);
List posts=postRepository.findAllByMonthAndYear(年,月);
Map postMap=新HashMap();
if(postMap.contains()){
//将记录添加到日期键的列表中
postMap.put(天,postMap.get(天),add(postObject));
}否则{
//为日期添加新条目
List posts=new ArrayList();
posts.add(postObject);
postMap.put(天,postMap.get(天),add(posts));
}

使用java 8可以以更简短的形式实现类似的功能

postMap.computeIfAbsent(day, k -> Collections.emptyList()).add(postObject);
还有另一种方法,如果使用类后getDay方法或其他方法来获取日期:

Map<Date, List<Post>> postMap = posts.stream().collect(Collectors.groupingBy(Post::getDay));
Map postMap=posts.stream().collect(Collectors.groupingBy(Post::getDay));
这两种方法都应该很有效。第二个更精确,更具声明性