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



我需要定义映射,其中键是一天,值是帖子列表。在RequestMapping中,我给出/{year}/{month}/{day},但日期是可选的。如何定义map并将其返回到json以获得json,其中days从1-31到days,我得到了在这一天创建的对象列表。我的控制器代码:

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

}

逻辑是这样的,检查地图中是否存在日期(关键字(。

1( 如果是,检索当天的帖子列表,并将新帖子添加到列表

2( Else在地图中添加新的日期条目

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

使用java8可以以更短的形式实现类似的功能。

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

另一种方法是POST类getDay方法或其他方法:

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

这两种方法都应该很好。第二个是更精确和声明性的。

最新更新